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;