Hive は Delta Lake または Apache Hudi にデータを書き込むことはできませんが、外部テーブル経由で両方のフォーマットからデータをクエリできます。本トピックでは、E-MapReduce (EMR) クラスター内の Hive を使用して Delta Lake および Hudi データをクエリする方法について説明します。
前提条件
作業を開始する前に、以下の要件を満たしていることを確認してください。
-
Hive、Delta Lake、および Hudi サービスがインストールされたクラスターが存在すること。詳細については、「クラスターの作成」をご参照ください。
-
クラスターにログイン済みであること。詳細については、「クラスターへのログイン」をご参照ください。
制限事項
Hive を使用して Hudi データを読み取るには、ご利用のクラスターが以下のバージョン要件を満たしている必要があります。
| EMR バージョン | Hive による Hudi アクセス |
|---|---|
| V3.36.0 およびそれ以降のマイナーバージョン | サポート対象 |
| V5.2.0 およびそれ以降のマイナーバージョン | サポート対象 |
| 上記以前のバージョン | サポート対象外。代わりに Spark または Flink を使用して Hudi データをクエリしてください。 |
Hive を使用した Delta Lake データのクエリ
Hive は、Spark で作成された Delta Lake テーブルを読み取ることができます。以下の手順では、Spark で Delta Lake テーブルを作成し、データを挿入してから、Hive でそのデータをクエリする方法を説明します。
ステップ 1:Spark での Delta Lake テーブルの作成
-
Spark CLI を開きます。
spark-sql -
delta_tableという名前の Delta Lake テーブルを作成します。create table delta_table (id int) using delta; -
テーブルにデータを挿入します。
insert into delta_table values 0,1,2,3,4; -
Spark でテーブルをクエリして、データを確認します。
select * from delta_table;出力は次のようになります。
2 3 4 0 1 Time taken: 1.847 seconds, Fetched 5 row(s)
ステップ 2:Hive での Delta Lake データのクエリ
-
Hive CLI を開きます。
hive -
(オプション)テーブルのメタデータを確認します。
desc formatted delta_table; -
Delta Lake テーブルをクエリします。
select * from delta_table;出力は次のようになります。
OK 2 3 4 0 1 Time taken: 1.897 seconds, Fetched: 5 row(s)Hive によって返されたデータは、Spark の Delta Lake テーブル内のデータと一致しており、Hive が Delta Lake データを正常に読み取れることを確認できます。
Hive を使用した Hudi データのクエリ
Hudi へのデータ書き込みは Spark または Flink のみがサポートしています。Hive は読み取り専用アクセスのみをサポートします。
ステップ 1:Spark を使用した Hudi データの準備
Hive からクエリする前に、Spark SQL を使用して Hudi テーブルを作成し、データを投入します。
Spark SQL の起動
起動コマンドは、ご利用のクラスター内の Spark および Hudi のバージョンによって異なります。
-
Spark 2 または Spark 3 で Hudi 0.11 より前のバージョンを使用する場合:
spark-sql \ --conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \ --conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension' -
Spark 3 で Hudi 0.11 以降のバージョンを使用する場合:
spark-sql \ --conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \ --conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension' \ --conf 'spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog'
Hudi テーブルの作成およびデータ投入
-
h0という名前の Hudi テーブルを作成します。create table h0 ( id bigint, name string, price double, ts long ) using hudi tblproperties ( primaryKey="id", preCombineField="ts" ); -
テーブルスキーマを確認します。
desc formatted h0;出力は次のようになります。
_hoodie_commit_time string _hoodie_commit_seqno string _hoodie_record_key string _hoodie_partition_path string _hoodie_file_name string id bigint name string price double ts bigintHudi はすべてのテーブルに自動的に 5 つのメタデータフィールド(
_hoodie_commit_time、_hoodie_commit_seqno、_hoodie_record_key、_hoodie_partition_path、および_hoodie_file_name)を追加します。これらのフィールドは、select *を使用するすべてのクエリ結果に表示されます。 -
データの挿入、更新、および削除を行います。
-- insert insert into h0 values (1, 'a1', 10, 1000), (2, 'a2', 11, 1000); -- update update h0 set name = 'a1_new' where id = 1; -- delete delete from h0 where id = 1; -
データを確認します。更新および削除操作後、
id=2の行のみが残ります。説明h0は非パーティション化テーブルであるため、_hoodie_partition_pathは空です。出力の先頭 5 つの値は、5 つの Hudi メタデータフィールドに対応しています。select id, name, price, ts from h0;出力は次のようになります。
2 a2 11.0 1000Hudi のメタデータフィールドを結果に含めるには、次のコマンドを実行します。
select * from h0;出力は次のようになります。
4.820221130150621338 20221130150621338_0_1 id:2 40d6507e-0579-42ce-a10f-c5e07a3981e5-0_0-29-2007_2022113015062****.parquet 2 a2 11.0 1000
Hudi の Spark に関するその他の例については、「Spark Guide」をご参照ください。
ステップ 2:Hive での Hudi データのクエリ
Hive CLI を開くか、Beeline を使用して Hive ThriftServer に接続し、Hudi テーブルに対してクエリを実行します。
-- select
select * from h0;
次のステップ
-
Spark でのより高度な Hudi 操作については、「Apache Hudi Spark Guide」をご参照ください。