Hudi 外表

最近更新时间:2024-09-04 11:50:41

我的收藏
腾讯云数据仓库 TCHouse-P 支持直接访问 Hudi 外部表的能力,外部表省去了繁琐的数据导入工作,可进行更加复杂的分析操作。

创建 hdfs_fdw 插件

CREATE EXTENSION hdfs_fdw;

创建 SERVER

下述3种 Server 根据实际情况选择一种即可。

创建 cos server

CREATE SERVER $cos_server
FOREIGN DATA WRAPPER hdfs_fdw
OPTIONS (address 'cos://$bucketname', appid '$appid', access_keyid '$ak', secret_accesskey '$sk', region '$region', client_type 'cos');

创建 hdfs server

CREATE SERVER $hdfs_server
FOREIGN DATA WRAPPER hdfs_fdw
OPTIONS (address 'ofs://xxxxxx.chdfs.ap-guangzhou.myqcloud.com', appid '$appid', client_type 'hdfs');

创建融合桶 Server

CREATE SERVER $cosn_server
FOREIGN DATA WRAPPER hdfs_fdw
OPTIONS (address 'cosn://$bucketname', appid '$appid', access_keyid '$ak', secret_accesskey '$sk', region '$region', client_type 'cosn', ranger '$ip:$port', is_s3 'true/false');
注意:
1. 如果融合桶开启了 Ranger 鉴权并且想走 posix 协议,则 ranger 中需要填写 ranger 的 IP:PORT, 在 ranger 的 service 中随机选择一个 IP:PORT即可。如果此融合桶没有开启 Ranger 鉴权,则不用配置此参数。
2. 默认走融合桶的 S3 协议,如果想走 posix 协议,可将 is_s3 参数设置为 false。
3. ranger 如果被设置,则不管 is_s3 被设置为 true 还是 false,都会走 posix 协议。ranger 如果没有设置,就以 is_s3 设置为准(不设置默认为true)。

创建 USER MAPPING

下述3种根据实际情况选择一种即可。
CREATE USER MAPPING FOR $TDSQL-A用户 SERVER $cos_server; --前面创建的cos server的
CREATE USER MAPPING FOR $TDSQL-A用户 SERVER $hdfs_server; --前面创建的hdfs server的
CREATE USER MAPPING FOR $TDSQL-A用户 SERVER $cosn_server; --前面创建的融合桶 server的

创建 Hudi 外表

创建 hudi 外表需要明确指定 datasource 为 Hudi,tabletype 需要根据远程 EMR 上的 hudi 表的具体类型而定,可选的有 cow 和 mor,FORMAT 也需要根据远程 EMR 上的 hudi 表的底层存储文件格式一致。
注意:
1. \\_hoodie\\_commit\\_time 为 hudi 增量查询关键字段,必须在建 Hudi 外表时显示指定。

创建 Hudi 非分区表

创建 Hudi cow 表

CREATE FOREIGN TABLE f_hudi_cow_nonpcf_tbl (
_hoodie_commit_time varchar,
uuid int,
name varchar,
price float8
) SERVER $ServerName OPTIONS (FOLDERNAME '$数据目录/', FORMAT 'parquet', distribute 'shard', datasource 'hudi', tabletype 'cow');

创建 Hudi mor 表

CREATE FOREIGN TABLE f_hudi_mor_tbl (
_hoodie_commit_time varchar,
id int,
name varchar,
price float8,
ts bigint,
dt varchar
) SERVER $ServerName OPTIONS (FOLDERNAME '$数据目录/', FORMAT 'parquet', distribute 'shard', datasource 'hudi', tabletype 'mor');

创建 Hudi 分区表

CREATE FOREIGN TABLE f_hudi_cow_pt_tbl (
_hoodie_commit_time varchar,
id bigint,
name varchar,
ts bigint,
dt varchar,
hh varchar
) SERVER $ServerName OPTIONS (FOLDERNAME '$数据目录/', FORMAT 'parquet', distribute 'shard', datasource 'hudi', tabletype 'cow', PARTITION 'dt,hh');
注意:
1. hudi 分区字段提升为 TDSQL-A 的普通字段
2. PARTITION 中填写 hudi 的分区字段,多级分区用逗号隔开,例如:PARTITION 'dt,hh'

查询 Hudi 外表并将数据导入内部表

insert into 内部表 select * from hudi外部表;

Hudi 表增量查询

select * from hudi外部表 where _hoodie_commit_time > '$时间';

Hudi mor 表查询类型

针对 Hudi mor 表查询类型支持快照查询和读优化查询2种。
1. 如果想进行 mor 表的读优化查询需要设置 GUC 参数:
set hdfs_fdw.hudi_mor_read_optimized = true;
2. 如果想进行 mor 表的快照查询需要设置 GUC 参数:
set hdfs_fdw.hudi_mor_read_optimized = false;