巣箱
まずは、ハイブが何であるかを説明しましょう。一部の人々は、ハイブはSQLを実行しません書くこと、考えるだけでなく。はい、ハイブSQL構文と、のような構造は、実際には、両者の間に大きな違いがない、とさえハイブ書き込みSQLに、言うことができます。しかし、質問が来た - それは本当にまだそのSQLのですか?これは、データベースをSQLとの違いは何ですか?そして、他の伝統的なオフラインデータベース差がどのような関係とは何ですか?クラス問題のシリーズは、私たちはゆっくりと分析、心配しないでください。
1は、ハイブがオープンFacebookとによって実装
2、データ・ウェアハウス・ツールのHadoopに基づいて
図3に示すように、構造化データは、データベーステーブルにマッピングすることができる
4、及びHQL(ハイブSQL)が照会提供する
基礎となるデータが中に記憶されている、5 HDFS
6は、本質的にハイブSQL文のMapReduceタスクが実行変換する
7、MapReduceのHQLを容易に計算し、オフラインで計算されたバルクデータに適したHDFSのデータ構造の処理を用いてユーザ不慣れ。
データウェアハウス(データウェアハウス)がある - 1991年にビル(ビル・インモン)のデータウェアハウスのドアの恵みの父は、提案された定義が広く受け入れられている彼の本の中で(「データウェアハウス」)「データ・ウェアハウスの構築」公表しますサブジェクト指向(件名指向)、統合(統合)、比較的安定は(不揮発性)、サポート経営の意思決定(意思決定支援)への変更履歴(タイム・バリアント)データ収集を反映しています。
ハイブは、データを格納するためのHDFSに依存して、マップリデュースを実行するハイブHQLを変換し、ハイブをHadoopのに基づいているので、データ・ウェアハウス・ツールは、本質的に、HDFSのMapReduceのフレームワークに基づく計算は、データがHDFS分析および管理に格納されていること。
ハイブ背景
ビッグデータの時代に、従来のリレーショナルデータベース上のデータの膨大な量は、メンテナンスコストが非常に高いアップしている、我々はそれをどうしたらよいのでしょうか ハイブは、統計的な問題解決のための構造化、大規模なため、Facebookのオープンソースで始まる、この時点で最初のログデータを生まれた、ETL(抽出・変換・ロード ) ツールのHadoopの構築データウェアハウスに、MR、データを用いて算出したデータストレージ利用HDFS。
一般(のMapReduceを用いて)処理するオフラインデータのために使用される、SQL同様の、しかし同一ではない;ハイブクラスは、SQLクエリHQLと呼ばれる言語を定義HQL MRは、言語翻訳と考えることができます。
Apacheのハイブデータウェアハウス・ソフトウェアは、簡単に大規模なデータセットの分散ストレージの分布を、読み取り、書き込み、および管理するためにSQLを使用することができます。構造は、既に格納されたデータに投影することができます。ハイブに接続するユーザーには、コマンドラインツールおよびJDBCドライバを提供します。次の分野での背景:
- 不便のMapReduceプログラミング
- いくつかのフィールドが欠落上のHDFSファイル
生態系でのHadoop Hiveの位置
ハイブのアーキテクチャ
それを言って、あなたはハイブについて知っている疑問は、なぜ我々はハイブにそれを使用したくない、ですので、あまり高くありませんか?まだそれについてのユニークな何ですか?MapReduceは、あなたはしていない使用していますか?だから、最初に、さんが直面したのMapReduceの直接の使用を取得してみましょう:
- スタッフ学習コストが高すぎます。
- 短すぎるプロジェクトサイクルの要件;
- 複雑なクエリロジックのMapReduceの開発は難しすぎます。
ハイブの使用:
- これは、急速な発展を提供する能力をSQLに似た構文を使用してインターフェイスフレンドリーなインターフェイス、オペレータがあります。
- 学習コスト、回避はMapReduceのを書くのコストを下げ、開発者が学習のコストを削減します。
- スケーラビリティは、クラスタサイズがサービスを再起動することなく、拡大して自由にすることができ、また、ユーザー定義関数をサポートしています。
私たちは、ハイブの長所と短所について話してみましょう:
利点
- スケーラブルスケーラブル、スケールは、ハイブは一般的に、クラスタの自由度を広げることができるサービスを再起動する必要はありません。スケール:膨張圧力平衡を介してクラスタのサイズ、縦拡張:サーバのCPU i7-6700k 4芯糸8、8コア16スレッド、メモリ64G => 128G
- 延性は、カスタム関数のためのハイブのサポートは、ユーザーが自分のニーズに応じて、独自の機能を実装することができます
- グッドフォールトトレランス、問題のノードがあっても保証することができ、SQL文は、まだ実行を完了することができます
短所
- ハイブは、レコードレベルのCRUD操作をサポートしていませんが、ユーザーがファイル(現在選択されているレコードレベルのサポートインサートのハイブ-2.3.2バージョン)にクエリ結果によって新しいテーブルまたはクエリを作成することができます。
- MapReduceのジョブ起動プロセスは、長い時間を消費し、それは対話型のクエリシステムで使用することはできませんので、ハイブクエリの待ち時間は、非常に深刻です。
- ハイブは、(それが何の追加と削除ではないではありませんので、それは主に代わりに2レベルのデータ処理であり、OLTP(オンライントランザクション処理)、の、OLAP(オンライン分析処理)のために使用されている)トランザクションをサポートしていません。
要約:
ハイブは、SQLデータベースの外観を有するが、シナリオは完全に異なっている、ハイブは、データウェアハウスである大規模なオフライン統計分析、アプリケーションにのみ適しています。
ハイブは、それがどのような機能、それを見ている、非常に簡単に使用することもあります。
関係機能
-
等価比較:=
- 構文:A = B. 式A及びBはTRUE比べ、同じ式である場合、そうでない場合はFALSE
-
いいえ等価比較ません:<>
- 構文:A <> B. 式Aおよび式Bに等しくない場合、TRUEであった;そうでなければFALSE発現は、発現またはBがNULLで、戻りNULL NULLの場合A
-
比較より小さい<
- 構文:A <B。式がNULL、式であるか、またはBは、NULL、戻りNULLである場合、Aは式Bの発現、TRUEより小さい場合、そうでない場合はFALSE
-
以下で比較:<=
- 構文:A <= B. TRUE B、以下の式式A場合;そうでなければFALSE発現は、発現またはBがNULLで、戻りNULL NULLの場合A
-
以上の比較:> =
- 文法:A> = B. A式がNULLの場合、発現またはBがNULL、戻りNULLであり; Aは、以上TRUE B、に表現式と等しい場合は、そうでない場合はFALSE
-
ヌル値の決意:IS NULL
- 文法:A IS NULL。値がAのNULL式である場合、それは本当だった、そうでない場合はFALSE
-
非空で分析すると、:NULLではありません
- 文法:A IS NOT NULL。値がAのNULL式である場合、それはFALSEだった、そうでない場合はTRUE
-
LIKE比较:LIKE
- 構文:A [NOT] LIKE B. A又はB列の文字列がNULLの場合、NULLが返され、文法の線Bに文字列Aの正規表現ならば、TRUEのために、そうでない場合はFALSE。B、文字「_」任意の一文字を意味し、文字「%」は、任意の数の文字を表します。
例: dw.topic_orderからSELECT * WHERE partition_pay_dateのような=「2016年4月22日」とclient_typeのIP% ' ## IPで始まるすべての文字列を一致させることができます。
注:特殊文字は2つのバックスラッシュを使用して、それを変換\
- 構文:A [NOT] LIKE B. A又はB列の文字列がNULLの場合、NULLが返され、文法の線Bに文字列Aの正規表現ならば、TRUEのために、そうでない場合はFALSE。B、文字「_」任意の一文字を意味し、文字「%」は、任意の数の文字を表します。
-
JAVA-LIKE / REGEXP操作:RLIKE / REGEXP
- 文法:A RLIKE / REGEXP B. A列やB列がNULLの場合、NULLが返され、通常の場合、文字列A準拠JAVA正規表現構文のB、TRUEだった、そうでない場合はFALSE
例:partition_pay_date = dw.topic_order SELECT * FROM 「2016- 4月22日「とclient_type RLIKE /正規表現」 ^アンドロイド*「
注:ワイルドカード」% 『RLIKE /正規表現機能では、唯一の一致する』% 『文字』を『は』と一致することができます「文字を
- 文法:A RLIKE / REGEXP B. A列やB列がNULLの場合、NULLが返され、通常の場合、文字列A準拠JAVA正規表現構文のB、TRUEだった、そうでない場合はFALSE
日付関数
- UNIXタイムスタンプの日付伝達関数:FROM_UNIXTIME
- 構文:FROM_UNIXTIME(BIGINT unixtime [文字列フォーマット])。現在のタイムゾーンの時刻フォーマットへ(1970-01-01 00:00:00時刻から指定した秒数に)UNIXタイムスタンプの変換
例を選択FROM_UNIXTIME(1323308943「YYYYMMDD:デュアルから」); ## 戻り値20111208
- 構文:FROM_UNIXTIME(BIGINT unixtime [文字列フォーマット])。現在のタイムゾーンの時刻フォーマットへ(1970-01-01 00:00:00時刻から指定した秒数に)UNIXタイムスタンプの変換
- 年:伝達関数の日の
- 構文:年(文字列日付)。日付の年を返します。
- 日付1月転送機能:月
- 構文:月(文字列日付)。日付の月を返します。
- 日付関数次の日:1日
- 構文:1日(文字列日付)。日付の日を返します。
- 日付時間伝達関数:時間
- 構文:時間(文字列日付)。日付の時間を返します。
- 伝達関数分の日:分
- 構文:分(文字列日付)。分の日付を返します。
たとえば:セレクト分(「2011-12-08 10時03分01秒」 )デュアルからは、## 3の値を返します
- 構文:分(文字列日付)。分の日付を返します。
- 二日転送機能:秒
- 構文:秒(文字列日付)。数秒で日付を返します。
例えば:選択秒(「2011-12-08午前10時03分01秒」 )デュアルから; ## 戻り値1
- 構文:秒(文字列日付)。数秒で日付を返します。
- 日付ウィーク伝達関数:weekofyear
- 構文:weekofyear(文字列日付)。現在の週の日付を返します。
例えば:選択weekofyear(「2011-12-08午前10時03分01秒」 )デュアルからは、## 49の値を返します
- 構文:weekofyear(文字列日付)。現在の週の日付を返します。
- 日付の比較機能:DATEDIFF
- 構文:DATEDIFF(文字列ENDDATE、文字列STARTDATE )。終了日を引い開始日の日数を返します。
例えば選択DateDiff関数( '2012年12月8日'、: ; ## '2012-05-09')デュアルからの戻り値は213
- 構文:DATEDIFF(文字列ENDDATE、文字列STARTDATE )。終了日を引い開始日の日数を返します。
- 増加関数の日:DATE_ADD
- 構文:DATE_ADD(文字列STARTDATE、INT日 )。増加の日付以降に開始日STARTDATE日の日を返します。
例えば:選択DATE_ADD(「2012年12月8日」、 10)デュアルから、## の戻り値2012年12月18日
- 構文:DATE_ADD(文字列STARTDATE、INT日 )。増加の日付以降に開始日STARTDATE日の日を返します。
- 日付減少関数:DATE_SUB
- 構文:DATE_SUB(文字列STARTDATE、INT日 )。開始日は、日の日付の後日数を減らす開始日を返します。
例えば、選択DATE_SUB(「2012年12月8日」、: ; ## 10)デュアルからの戻り値2012年11月28日
- 構文:DATE_SUB(文字列STARTDATE、INT日 )。開始日は、日の日付の後日数を減らす開始日を返します。
条件付き機能
- 機能の場合:もし
- 構文:IF(ブールtestCondition、T valueTrue 、T valueFalseOrNull)
説明:条件testConditionがTRUEである場合、valueTrueを返し、そうでない場合valueFalseOrNull。
例えば:IF(APP_NAME = 'グループを選択 dw.topic_orderからここpartition_pay_date = '2016年4月22日' deal_idとして'、OBJECT_ID、NULL)を
- 構文:IF(ブールtestCondition、T valueTrue 、T valueFalseOrNull)
- COALESCE:非空の関数を探します
- 構文:COALESCE(T V1を、T V2 、...)
説明:最初の非ヌル値パラメータを返し、それぞれの値がNULLの場合、NULLを返し
、例えば:セレクト合体(UUID、 '' )DWからUUIDとして。 topic_orderどこpartition_pay_date = '2016年4月22日'
- 構文:COALESCE(T V1を、T V2 、...)
- 条件付き機能:CASE
- 構文:ケースA、B THEN C [ D THEN E] * [ELSE F] ENDの
説明:Bに等しい場合、Cを返し、Dに等しい場合、次にEを返し、そうでない場合はfを
例:選択OBJECT_ID、USER_IDを「IPのようなUUID、ケースclient_type %」「を」アンドレ%、次いで「のようios'when client_type」アンドロイド2016年4月22日'「他の」その他「utm_mediumfrom dw.topic_orderここpartition_pay_date =として」末端
相対:注意関数は最も完全な状態である場合、ケースは、種々の条件を決定するために使用することができる。機能が続く場合、二つの点に属する決定される。のみヌルおよび非ヌル決意することができ、最終的に合体機能、。
- 構文:ケースA、B THEN C [ D THEN E] * [ELSE F] ENDの
統計関数
- 統計関数の数:数
- 構文:COUNT( )、COUNT(expr)は、COUNT(DISTINCT式expr [、expr_。])。(カウント、NULL値の行数の非ヌル値の指定されたフィールド;;取り出される行の数をカウント返し)カウント(exprの数)(DISTINCTのexprを[。、expr_ ])が異なる以外の指定されたフィールドを返しますヌル値の数
- 統計関数の合計:合計
- 構文:合計(COL)、SUM( DISTINCT COL)。濃縮COLの添加(COL)統計の合計結果、加算結果COLの異なる値の(DISTINCT COL)統計合計
- 平均の統計関数:平均
- 構文:AVG(COL)、AVG( DISTINCT COL)。平均(COL)COLの結果セットの統計的平均値(DISTINCT COL)COL異なる統計平均の平均値では、追加されます
- 最低限の統計関数:分
- 構文:分(COL)。結果セットの最小値で統計的COLフィールド
- 最大の統計関数:最大
- 構文:最大(COL)。統計COLフィールドの最大濃度
- 中央値機能:precentile構文:パーセンタイル(BIGINT COL、P)。PTHパーセンタイルの精度を求め、pは0と1、COLフィールドの間であるが、現在唯一の整数をサポートする必要があり、浮動小数点型はサポートされていません。
これらは、私は、ハッハッハ、非常に多くのSQLのように見えた非常に重要な部分は、権利はないと思う、私はちょうど記載されているここにいる、多くありますが、ハイブの関数宣言されています。実際には、難しいことではありません。まあ、我々はそれが類似点と相違点やデータベースであると言います。
ハイブは、SQLに似たクエリ言語HQLを使用しているので、ハイブデータベース用に理解することは簡単です。実際には、構造上の観点から、ハイブは、しかも同様のデータベースクエリ言語、ない類似性を有しています。オンラインデータベースは、用途において使用することができますが、ハイブは、アプリケーションの観点から、このことを認識して設計されたデータウェアハウスは、ハイブの特性を理解するのに役立ちますです。