如何在S3上创建带子文件夹的分区Trino表及自动生成表结构
Trino表定义与Schema自动生成解决方案
背景信息
S3存储路径
s3://bucketname/snapshot/db_collection/snapshot1/*.parquet s3://bucketname/snapshot/db_collection/snapshot2/*.parquet s3://bucketname/snapshot/db_collection/snapshot3/*.parquet
核心需求
- 在
s3://bucketname/snapshot/db_collection/层级创建Trino表,保留多快照的重复行(即每个快照的行独立返回),但snapshotX目录不是标准<key>=<value>分区格式。 - 自动生成包含150个嵌套列的Trino表结构,排除AWS Glue Crawler+Athena方案(已尝试并报错)。
- 现有表定义(仅示例部分列):
create table trino.db_collection ( col1 varchar, col2 varchar, col3 varchar )with ( external_location = 's3a://bucket/trino/db_collection/*', format = 'PARQUET' )
环境
AWS EMR 6.8.0 + Trino v388
解决方案
1. 非标准分区目录的表定义
Trino支持隐式分区识别,可将snapshotX目录作为分区列值,无需修改目录格式。
步骤:
开启隐式分区配置:在Trino的Hive连接器配置文件(
hive.properties)中添加:hive.implicit-partitioning.enabled=true也可在创建表时单独指定该参数(优先级更高)。
创建带分区的表:
create table trino.db_collection ( -- 后续替换为自动生成的完整列结构 col1 varchar, col2 varchar, col3 varchar ) partitioned by (snapshot_id varchar) with ( external_location = 's3a://bucketname/snapshot/db_collection/', format = 'PARQUET', hive.implicit-partitioning.enabled = true );加载分区:执行命令让Trino识别所有
snapshotX目录为分区:MSCK REPAIR TABLE trino.db_collection;此后查询时,每个快照的行都会带上对应的
snapshot_id值,同一行存在于多个快照时会返回多行。
2. 自动生成嵌套列的表结构
方法一:Trino临时表反向生成Schema
利用Trino自动读取Parquet文件Schema的能力,通过临时表导出完整表定义:
创建临时表:指向单个快照的Parquet文件,让Trino自动推断Schema:
CREATE TABLE trino.temp_db_collection WITH ( external_location = 's3a://bucketname/snapshot/db_collection/snapshot1/', format = 'PARQUET' ) AS SELECT * FROM TABLE( hive.parquet_scan('s3a://bucketname/snapshot/db_collection/snapshot1/') ) LIMIT 0;(
LIMIT 0避免加载数据,仅读取Schema)导出表定义:执行命令获取完整的CREATE TABLE语句:
SHOW CREATE TABLE trino.temp_db_collection;复制输出的SQL,替换掉临时表名、添加分区配置,即可得到正式表的完整定义。
方法二:parquet-tools导出Schema后转换
导出Parquet Schema:在EMR节点上执行(EMR通常自带
parquet-tools,若无则用yum install parquet-tools安装):parquet-tools schema s3://bucketname/snapshot/db_collection/snapshot1/sample.parquet > schema.json转换为Trino SQL类型:
- Parquet的
struct对应Trino的ROW(col_name type, ...) - Parquet的
list对应Trino的ARRAY(type) - Parquet的
map对应Trino的MAP(key_type, value_type)
可手动转换或用简单脚本批量处理JSON Schema,生成完整的列定义。
- Parquet的
3. 替代Glue Crawler的方案
以上两种自动生成Schema的方法均无需依赖AWS Glue Crawler,直接在Trino内部或EMR节点完成,避免了Glue+Athena的异常问题。若临时表推断Schema出现异常,可检查Parquet文件的版本兼容性,Trino v388对嵌套Parquet的支持完善,确保S3路径权限正常即可。
内容的提问来源于stack exchange,提问作者chendu
相关产品推荐
相关产品推荐

