Hive不支持寫入數據到Delta Lake和Hudi,但是可以通過外部表的方式查詢Delta Lake和Hudi中的數據。本文通過示例為您介紹如何使用EMR上的Hive訪問Delta Lake和Hudi數據。
前提條件
使用限制
EMR-3.36.0及后續版本和EMR-5.2.0及后續版本,支持Hive對Hudi進行讀操作。
Hive訪問Delta Lake數據
執行以下命令,進入Spark命令行。
spark-sql
在Spark中創建并查詢表數據。
執行以下命令,在Spark中創建Delta表。
create table delta_table (id int) using delta;
執行以下命令,向表中插入數據。
insert into delta_table values 0,1,2,3,4;
執行以下命令,查看表數據。
select * from delta_table;
返回包含如下的信息。
2 3 4 0 1 Time taken: 1.847 seconds, Fetched 5 row(s)
在Hive中查看Delta Lake數據。
執行以下命令,進入Hive命令行。
hive
執行以下命令,在Hive中查看Delta Lake表。
desc formatted delta_table;
執行以下命令,在Hive中查看Delta Lake表的數據。
select * from delta_table;
返回如下信息。
OK 2 3 4 0 1 Time taken: 1.897 seconds, Fetched: 5 row(s)
說明查看數據與在Spark中插入的數據一致,說明Hive已經成功訪問了Delta Lake的數據。
Hive訪問Hudi數據
Spark讀寫Hudi
啟動方式
Spark2和Spark3 hudi0.11以下版本
spark-sql \ --conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \ --conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension'
Spark3 hudi0.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'
使用示例
建表
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 bigint
說明_hoodie_commit_time
、_hoodie_commit_seqno
、_hoodie_record_key
、_hoodie_partition_path
、_hoodie_file_name
為Hudi默認添加的輔助字段。數據操作
-- 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;
查詢
示例1
select id, name, price, ts from h0;
查詢結果如下所示。
2 a2 11.0 1000
示例2
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
說明由于當前為非分區表,所以
_hoodie_partition_path
為空。前四個字段為Hudi默認添加的輔助字段的值。
更多Spark讀寫Hudi示例,請參見Spark Guide。
Hive查詢Hudi
Hudi僅支持Spark或者Flink建表和寫入數據,Hive僅支持查詢。
直接輸入hive
命令進入Hive CLI命令行或者通過Beeline連接Hive ThriftServer,然后執行SQL語句即可。示例如下。
-- select
select * from h0;