Hiveクエリ言語とは? HiveQL Operaトー

⚡ スマートサマリー

Hive Query Language は、すべての HiveQL 式、グループ、グループを駆動する演算子を提供します。ping それらを関係型、算術型、論理型、複合型、コンストラクタの各ファミリーに分類し、これらを合わせて比較、計算、ネストされたデータへのアクセスを網羅する。

  • 🧮 5つの事業者ファミリー: 関係演算子、算術演算子、論理演算子、複合型演算子、およびコンストラクタ演算子は、HiveQLクエリに必要なあらゆる式を網羅しています。
  • 🔍 比較には任意のプリミティブ型が使用できます。 関係演算子はすべての基本型を受け入れますが、LIKE、RLIKE、REGEXPは文字列のみに作用します。
  • 算術演算にはビット演算が含まれます。 HiveQLは、4つの基本演算に加えて、数値型に対して剰余演算、ビット単位のAND、OR、XOR、NOT演算を提供します。
  • 🧩 ネストされたデータには独自の構文があります。 A[n]は配列要素にアクセスし、M[key]はマップ値にアクセスします。どちらも式が許可されている場所ならどこでも使用できます。
  • 🏗️ 構築者は複雑な価値を構築する。 array()、map()、struct()、named_struct()、create_union() は、クエリ内で複雑な列を組み立てます。
  • 📚 関数は演算子を拡張します。 数学関数、文字列関数、日付関数、条件関数、コレクション関数、集計関数は、演算子ではカバーされない処理を扱います。

Hiveクエリ言語(HiveQL)の演算子とは何ですか?

Hive クエリ言語 (HiveQL) とは何ですか?

Hive Query Language (HiveQL) は、次のクエリ言語です。 ApacheHive 構造化データの処理と分析に使用されます。MapReduceプログラミングの複雑さからユーザーを解放します。テーブル、行、列、スキーマなど、リレーショナルデータベースの共通概念を再利用することで、学習を容易にします。Hiveは、Hiveクエリ言語(HiveQL)を使用したHiveクエリ作成のためのCLIを提供します。

ほとんどの対話はコマンド ライン インターフェイス (CLI) 経由で行われる傾向があります。 一般に、HiveQL 構文は次のようになります。 SQL ほとんどのデータアナリストが使い慣れている構文です。オリジナルのHiveドキュメントに記載されているファイル形式は、TEXTFILE、SEQUENCEFILE、ORC、RCFILE(Record Columnar File)の4種類です。現在のリリースでは、ParquetとAvroの読み書きも可能で、チューニングに関するガイダンスの多くはORC形式を前提としています。

Hive は、シングルユーザーのメタデータストレージに組み込みの Derby データベースを使用します。マルチユーザーまたは共有メタストアの展開では、Hive は MySQL または、代わりに別の外部リレーショナルデータベースを使用してください。Derbyは一度に1つのセッションしか許可しないためです。

HiveQL 組み込み Operaトー

Hiveは、Hiveデータウェアハウスに格納されているテーブルに対して実行されるデータ操作のための組み込み演算子を提供します。

これらの演算子は、式内のオペランドに対して作用し、比較、計算、ネストされた列へのルックアップなど、適用されたロジックに従って値を返します。

以下は、HiveQLに組み込まれている主な演算子の種類です。

  • 関係演算子
  • 算術演算子
  • 論理演算子
  • Opera複雑な型上のtors
  • 複合型コンストラクタ

各ファミリーについては、以下の各セクションでそれぞれ詳しく説明しており、各ファミリーの完全な演算子表も掲載しています。

リレーショナル OperaHiveQL の tors

2つのオペランド間の関係を比較するために、関係演算子を使用します。

  • Opera等しい、等しくない、より小さい、より大きいなどの演算子。
  • これらの演算子におけるオペランドの型はすべてプリミティブ型であり、パターンマッチング演算子は文字列のみを受け入れます。

すべての関係演算子はブール値を返します。そのため、これらの演算子はWHERE句、JOIN条件、CASE WHEN分岐の構成要素となります。次の表は、関係演算子とそのHiveQLでの使用方法の詳細を示しています。

内蔵 Operaタ 詳細説明 Operand
X = Y 式Xが式Yと等しい場合はTRUE、そうでない場合はFALSE。 すべてのプリミティブ型を受け取ります
X != Y 式Xが式Yと等価でない場合はTRUE。それ以外の場合はFALSE。 すべてのプリミティブ型を受け取ります
X < Y 式Xが式Yより小さい場合はTRUE、そうでない場合はFALSE。 すべてのプリミティブ型を受け取ります
X <= Y 式Xが式Y以下の場合、TRUE。それ以外の場合はFALSE。 すべてのプリミティブ型を受け取ります
X > Y 式Xが式Yより大きい場合はTRUE、そうでない場合はFALSE。 すべてのプリミティブ型を受け取ります
X >= Y 式Xが式Y以上の場合、TRUE。それ以外の場合はFALSE。 すべてのプリミティブ型を受け取ります
X は NULL です 式XがNULLと評価される場合はTRUE、それ以外の場合はFALSE。 すべてのタイプが必要です
X は NULL ではありません 式XがNULLと評価される場合はFALSE、それ以外の場合はTRUE。 すべてのタイプが必要です
X のような Y 文字列パターンXがYと一致する場合はTRUE、そうでない場合はFALSE。 文字列のみを受け取ります
X RIKE Y X または Y が NULL の場合は NULL、X のいずれかの部分文字列が一致する場合は TRUE Java 正規表現の場合は Y、それ以外の場合は FALSE です。 文字列のみを受け取ります
X 正規表現 Y RLIKEと同じです。 文字列のみを受け取ります

NULLとの比較では、決してTRUEまたはFALSEが返されないことに注意してください。そのため、表ではX = NULLが機能することを期待するのではなく、IS NULLとIS NOT NULLを別々の演算子として記載しています。

HiveQL 算術演算 Operaトー

算術演算子は、被演算項に対して算術演算を実行するために使用されます。

  • 加算、減算などの算術演算tracオペランド間の乗算、除算にはこれらの演算子を使用します。
  • これらの演算子におけるオペランドの型はすべて数値型です。

サンプル例:

2 + 3 は 5 になります。

この例では、「+」が演算子、2と3が被演算項、戻り値は5です。

以下の表は、Hiveクエリ言語における算術演算子の詳細を示しています。

内蔵 Operaタ 詳細説明 Operand
X+Y X と Y の値を加算した出力が返されます。 すべての数値タイプを受け取ります
X–Y これはsubの出力を返しますtracXの値からYの値を取得します。 すべての数値タイプを受け取ります
X * Y X 値と Y 値を乗算した出力を返します。 すべての数値タイプを受け取ります
X/Y Y を X から除算した出力を返します。 すべての数値タイプを受け取ります
X%Y X を Y で割った余りを返します。 すべての数値タイプを受け取ります
X&Y X と Y のビット単位の AND の出力を返します。 すべての数値タイプを受け取ります
X | よ X と Y のビット単位の OR の出力を返します。 すべての数値タイプを受け取ります
X^Y X と Y のビット単位の XOR の出力を返します。 すべての数値タイプを受け取ります
~X X のビットごとの NOT の出力を返します。 すべての数値タイプを受け取ります

最後の4行は通常の算術演算ではなくビット演算です。整数オペランドのバイナリ表現に対して演算を行うため、&、|、^ は次のセクションで説明する論理AND、OR、NOTとは異なります。

HiveQL 論理 Operaトー

論理演算子は、被演算項に対して論理演算を行うために使用します。

  • オペランド間のAND、OR、NOTなどの論理演算には、これらの演算子が使用されます。
  • これらの演算子におけるオペランドの型はすべてブール型です。

以下の表は、HiveQLにおける論理演算子の詳細を示しています。

オペレーター 詳細説明 OperaNDS
XとY X と Y の両方が TRUE の場合は TRUE、それ以外の場合は FALSE です。 ブール型のみ
X && Y X AND Y と同じですが、ここでは && 記号を使用します。 ブール型のみ
X または Y X または Y のいずれか、あるいは両方が TRUE の場合は TRUE、それ以外の場合は FALSE です。 ブール型のみ
X || よ X OR Y と同じですが、ここでは || 記号を使用します。 ブール型のみ
×ではありません X が FALSE の場合は TRUE、それ以外の場合は FALSE です。 ブール型のみ
!X NOT Xと同じですが、ここでは!記号を使用します。 ブール型のみ

関係演算子はブール値を返すため、論理演算子はそれらを組み合わせるものです。例えば、salary > 50000 AND dept = 'Sales' のような述語は、あるファミリーを別のファミリーに連鎖させます。

Opera複合型に関する

関係演算子、算術演算子、論理演算子はすべて単一のスカラー値に対して機能します。Hiveは配列、マップ、構造体の列も格納しますが、これらの要素にアクセスするには別のメカニズムが必要です。次の表は、そのメカニズムを提供する複合型演算子の詳細を示しています。

オペレーター OperaNDS 詳細説明
A[n] A は配列、n は整数型です これは配列Aのn番目の要素を返します。最初の要素のインデックスは0です。
M[キー] M は地図ですキーのタイプは K です これは、マップ内のキーに対応する値を返します。

どちらの形式も通常の式なので、SELECT リスト、WHERE 句、または GROUP BY で使用できます。また、構造体フィールドには、括弧の代わりにドット表記 (例: S.field) を使用してアクセスできます。

複合型コンストラクタ

上記の演算子が既存の複雑な列を読み取るのに対し、コンストラクタは新しい複雑な列を作成します。次の表は、Hive の複雑なデータ型 (配列、マップ、構造体) のインスタンスを作成する複合型コンストラクタの詳細を示しています。

このセクションでは、複合型コンストラクタに対して実行される操作について説明します。

オペレーター OperaNDS 詳細説明
配列 (val1、val2、…) 指定された要素(val1、val2など)を含む配列が作成されます。
組合を作成する (タグ、val1、val2、…) これは、タグパラメータによって参照される値を持つ共用型を作成します。
地図 (キー1、値1、キー2、値2、…) オペランドで指定されたキーと値のペアを含むマップを作成します。
名前付き構造体 (name1、val1、name2、val2、…) 指定されたフィールド名とオペランドで指定された値を持つ構造体を作成します。
構造 (val1、val2、val3、…) 指定されたフィールド値を持つ構造体を作成します。構造体のフィールド名は、col1、col2などとなります。

コンストラクタは、複雑な列にデータを挿入するINSERT文、または複数のスカラー列を1つの構造体にまとめてから結果を別のテーブルに書き込むSELECT文で最もよく使用されます。

HiveQLの組み込み関数

Operaは比較、計算、要素アクセスをカバーしますが、数値の丸め、文字列のトリミング、または置換は行いません。tract は 2 つの日付です。この処理は Hive の組み込み関数に属し、演算子が現れるのと同じ式の中で名前で呼び出されます。以下の表は、初心者が最初に出会う関数のグループを示しています。

機能ファミリー 典型的なメンバー 何に使われるのか
数学 round()、floor()、ceil()、abs()、pow()、sqrt()、rand() 単一の列値に対する丸め、べき乗、その他の数値計算。
String concat()、substr()、upper()、lower()、trim()、length()、regexp_replace() 清掃、トリミング、再整形ping 比較またはグループ化される前のテキスト。
日付 current_date、year()、month()、datediff()、date_add()、unix_timestamp() Extrac日付の各部分を特定し、2つの日付間の間隔を測定する。
条件付きの if()、CASE WHEN、coalesce()、nvl()、isnull() 行レベルで値を選択し、NULLを代替値に置き換える。
収集 size()、map_keys()、map_values()、array_contains()、sort_array() 複合型演算子によってアクセスされる配列、マップ、構造体の列を検査します。
型変換 キャスト()、バイナリ() 列を演算子が期待する型に強制的に変換する。
骨材(UDAF) count()、sum()、avg()、min()、max()、collect_set() 複数の行を1つの値にまとめる機能で、通常はGROUP BY句と組み合わせて使用​​されます。

関数リストはHiveのリリースによって異なるため、静的なページからではなく、セッション自体から読み込むのが望ましいです。以下の2つのステートメントでそれが可能です。

SHOW FUNCTIONS;

DESCRIBE FUNCTION round;

DESCRIBE FUNCTION EXTENDED round;

SHOW FUNCTIONS は登録されているすべての名前を一覧表示し、DESCRIBE FUNCTION は 1 行のシグネチャを出力し、EXTENDED 形式は実装クラスが提供する使用例を追加します。組み込み関数が適合しない場合、Hive は ユーザー定義関数 で書かれている Java.

HiveQLとSQL:主な違い

HiveQLは意図的にSQLの構文を借用しており、上記の演算子テーブルはSQLを書いたことがある人なら誰でも見覚えがあるでしょう。しかし、その内部の実行モデルは同じではなく、クエリが単純なSELECT文を超えるとすぐに違いが現れます。

行動 HiveQL 従来型SQL(RDBMS)
スキーマ処理 スキーマオンリード — ファイルがクエリされたときにスキーマが適用されます 書き込み時のスキーマ — 行が挿入されるときにスキーマが適用されます
行レベルの更新と削除 ACIDテーブルでのみサポートされています。Hive 3.0以降、管理対象テーブルはデフォルトでACIDです。 すべてのテーブルでデフォルトでサポートされています
インデックス Hive 3.0 (HIVE-18448) でインデックスのサポートが削除されました。ORC または Parquet ファイルレベルのインデックスとマテリアライズド ビューがそれに代わっています。 Bツリーやその他のセカンダリインデックスはコア機能です
実行速度とレイテンシー Tez、MapReduce、またはバッチジョブにコンパイルします。 Sparkそのため、小さな問い合わせでも作業開始コストが発生します。 対話型実行(通常はミリ秒単位)
設計目標 HDFSまたはオブジェクトストア上の非常に大きなファイルの処理能力 単一サーバーまたはクラスター上での低遅延の読み書き

表現力豊かな文章を書く上での実際的な影響は小さいが、確かに存在する。 Opera演算子は期待どおりに動作しますが、リレーショナルデータベースのインデックスから回答される述語は、Hive ではファイルのスキャンによって回答されるため、パーティション列でフィルタリングする方が、演算子自体を調整するよりもはるかに効果的です。

よくあるご質問

キーワード、ANDやLIKEなどの演算子、および関数名は、大文字小文字を区別せずに解決されるため、SELECTとselectは同じように動作します。文字列データはそうではありません。'Sales'と'sales'を比較すると、upper()またはlower()を最初に適用しない限りFALSEが返されます。

X / Y は、両方のオペランドが整数であっても常に DOUBLE 型を返します。そのため、7 / 2 は 3 ではなく 3.5 を返します。整数除算には DIV キーワードを、剰余には % 演算子を使用してください。

算術演算子と比較演算子はNULLを伝播します。NULLを含む式はFALSEではなくNULLと評価されます。IS NULLまたはIS NOT NULLでテストし、値が演算子に到達する前にcoalesce()またはnvl()でフォールバックを置き換えてください。

LIKE は SQL ワイルドカードを使用し、% は任意の連続文字に一致し、_ は 1 つに一致します。RLIKE は Java 値の任意の部分文字列に対する正規表現。REGEXPはRLIKEの同義語であり、動作は同じです。

算術演算子が最初に結合され、次に比較演算子、次にNOT、次にAND、最後にORの順になります。長い述語では順序が誤解されやすいため、ANDとORが同じ節に現れる場合は括弧を使用することをお勧めします。

はい。関係演算子と論理演算子は結合条件を形成し、算術演算子はグループを生成できます。ping キー、および M[key] のような複合型アクセスは、SELECT リスト、WHERE 句、ORDER BY など、式が許可されている場所であればどこでも有効です。

機械学習アシスタントは、平易な言語のフィルターを候補述語に変換し、文字列列と数値を比較するなど、型の不一致をフラグ付けします。Hive と 2 つの言語では方言が異なるため、生成された演算子を必ず上記の表と照らし合わせて確認してください。 Spark SQLとPresto。

一般的な述語を適切に処理し、短いコメントからcoalesce()やCASE WHENパターンを提案します。また、他のエンジンの構文も混在させているため、クエリを実行する前に、ビット演算子、複雑な型へのアクセス、および関数名をDESCRIBE FUNCTIONで確認してください。