腾讯云数据仓库 TCHouse-P 支持直接访问 Hudi 外部表的能力,外部表省去了繁琐的数据导入工作,可进行更加复杂的分析操作。
创建 hdfs_fdw 插件
CREATE EXTENSION hdfs_fdw;
创建 SERVER
下述3种 Server 根据实际情况选择一种即可。
创建 cos server
CREATE SERVER $cos_server名FOREIGN DATA WRAPPER hdfs_fdwOPTIONS (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_fdwOPTIONS (address 'ofs://xxxxxx.chdfs.ap-guangzhou.myqcloud.com', appid '$appid', client_type 'hdfs');
创建融合桶 Server
CREATE SERVER $cosn_server名FOREIGN DATA WRAPPER hdfs_fdwOPTIONS (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;