Hive 访问 Hudi 数据

最近更新时间:2024-02-21 17:39:01

我的收藏

开发准备

确认您已经开通了腾讯云,并且创建了一个 EMR 集群,详情参考创建集群
在创建 EMR 集群时在软件配置界面选择 Hive、Spark、Hudi 组件。

通过 spark 读写 Hudi

登录 master 节点并切换 hadoop 用户,使用 SparkSQL 的 HoodieSparkSessionExtension 扩展进行数据读写:
spark-sql --master yarn \\
--num-executors 2 \\
--executor-memory 1g \\
--executor-cores 2 \\
--jars /usr/local/service/hudi/hudi-bundle/hudi-spark3.3-bundle_2.12-0.13.0.jar \\
--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'
说明:
其中 --master 表示您的 master URL,--num-executors 表示 executor 数量,--executor-memory 表示 executor 的储存容量,以上参数也可以根据您的实际情况作出修改。 --jars 使用的依赖包版本在不同 EMR 版本中可能存在差异,请在 /usr/local/service/hudi/hudi-bundle 目录下查看并使用正确的依赖包
建表:
-- 创建COW非分区表


spark-sql> create table hudi_cow_nonpcf_tbl (
uuid int,
name string,
price double
) using hudi
tblproperties (
primaryKey = 'uuid'
);


-- 创建COW分区表


spark-sql> create table hudi_cow_pt_tbl (
id bigint,
name string,
ts bigint,
dt string,
hh string
) using hudi
tblproperties (
type = 'cow',
primaryKey = 'id',
preCombineField = 'ts'
)
partitioned by (dt, hh);


-- 创建MOR分区表


spark-sql> create table hudi_mor_tbl (
id int,
name string,
price double,
ts bigint,
dt string
) using hudi
tblproperties (
type = 'mor',
primaryKey = 'id',
preCombineField = 'ts'
)
partitioned by (dt);
写入数据:
-- insert into non-partitioned table
spark-sql> insert into hudi_cow_nonpcf_tbl select 1, 'a1', 20;


-- insert dynamic partition
spark-sql> insert into hudi_cow_pt_tbl partition (dt, hh) select 1 as id, 'a1' as name, 1000 as ts, '2021-12-09' as dt, '10' as hh;


-- insert static partition
spark-sql> insert into hudi_cow_pt_tbl partition(dt = '2021-12-09', hh='11') select 2, 'a2', 1000;
spark-sql> insert into hudi_mor_tbl partition(dt = '2021-12-09') select 1, 'a1', 20, 1000;

使用 Hive 查询 Hudi 表

登录 Master 节点并切换 hadoop 用户,执行以下命令连接 hive:
hive
添加 hudi 依赖包:
hive> add jar /usr/local/service/hudi/hudi-bundle/hudi-hadoop-mr-bundle-0.13.0.jar;
查看表:
hive> show tables;
OK
hudi_cow_nonpcf_tbl
hudi_cow_pt_tbl
hudi_mor_tbl
hudi_mor_tbl_ro
hudi_mor_tbl_rt
Time taken: 0.023 seconds, Fetched: 5 row(s)
查询数据:
hive> select * from hudi_cow_nonpcf_tbl;
OK
20230905170525412 20230905170525412_0_0 1 8d32a1cc-11f9-437f-9a7b-8ba9532223d3-0_0-17-15_20230905170525412.parquet 1 a1 20.0
Time taken: 1.447 seconds, Fetched: 1 row(s)

hive> set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
hive> select * from hudi_mor_tbl_ro;
OK
20230808174602565 20230808174602565_0_1 id:1 dt=2021-12-09 af40667d-1dca-4163-89ca-2c48250985b2-0_0-34-1617_20230808174602565.parquet 1 a1 20.0 1000 2021-12-09
Time taken: 0.159 seconds, Fetched: 1 row(s)


hive> set hive.vectorized.execution.enabled=false;
hive> select name, count(*) from hudi_mor_tbl_rt group by name;
a1 1
Time taken: 17.618 seconds, Fetched: 1 row(s)