使用S3+Hive元存储时,Trino读取已有文件建表的S3路径疑问
解决Trino + S3+Hive元存储创建分区表后查不到数据的问题
1. 先修正你的建表语句
你的建表语句有两处错误:
external_location不需要加*,应该指向分区表的根目录,通配符会导致路径识别异常- 语句末尾缺了闭合的右括号
正确的建表语句:
CREATE TABLE trino.partitioned_jsons ( a INTEGER, b INTEGER ) WITH ( external_location = 's3a://bucket/test/partitioned_jsons/', format='JSON', partitioned_by = ARRAY['snapshot'] );
注意:分区列snapshot不需要写在表的字段列表里——Hive元存储的分区列会自动作为表的虚拟列存在,重复定义反而会导致解析冲突。
2. 正确的S3文件存储路径
Hive兼容的分区路径必须遵循 分区列名=分区值 的子目录格式,也就是你尝试的第二种路径是正确的:
s3://bucket/test/partitioned_jsons/snapshot=partitionA/file.json
3. 让Trino识别已有的分区
你是先把文件放到S3再建表,Trino不会自动扫描S3路径发现分区,必须手动同步元数据:
MSCK REPAIR TABLE trino.partitioned_jsons;
这条命令会扫描external_location指定的根目录,把所有key=value格式的子目录识别为分区,同步到Hive元存储中。
4. 验证查询
执行完同步命令后,再查询表:
SELECT * FROM trino.partitioned_jsons;
就能看到snapshot=partitionA目录下的数据了。
为什么其他路径不行?
- 第一种路径
partitionA/file.json:不符合Hive分区key=value的命名规则,Trino无法把partitionA关联到snapshot分区列 - 第三种路径
snapshot/partitionA.json:既没有用key=value的目录结构,还把分区值作为文件名,Trino不会把文件名解析为分区列的值
内容的提问来源于stack exchange,提问作者romanzdk
相关产品推荐
相关产品推荐

