如何在AWS Glue作业中排除S3上的.hoodie目录与.commit文件
AWS Glue读取HUDI生成的Athena表时,无法排除HUDI元数据文件的问题
问题现象
在AWS Glue作业中调用create_dynamic_frame.from_catalog读取由HUDI填充的Athena表时,触发错误:提示s3://bucket/folder/.hoodie下的.commit文件不是Parquet格式。该问题已在GitHub上记录,但暂无官方解决方案。我们尝试通过additional_options的exclusions参数分别排除.hoodie目录和.commit文件,但均未生效,需要找到能同时过滤所有HUDI元数据资源的方法。
已尝试的解决方案
- 尝试排除
.hoodie目录:
datasource0 = glueContext.create_dynamic_frame.from_catalog( database=args['ENV']+"_some_database", table_name="some_table", transformation_ctx="datasource_x1", additional_options={"exclusions": "[\".hoodie/**\"]"} )
- 尝试排除
.commit文件:
datasource0 = glueContext.create_dynamic_frame.from_catalog( database=args['ENV']+"_some_database", table_name="some_table", transformation_ctx="datasource_x1", additional_options={"exclusions": "[\"**.commit\"]"} )
可行解决方案
调整exclusions参数的正则表达式,同时匹配.hoodie目录下的所有内容以及所有.commit文件,正确的代码如下:
datasource0 = glueContext.create_dynamic_frame.from_catalog( database=args['ENV']+"_some_database", table_name="some_table", transformation_ctx="datasource_x1", additional_options={ "exclusions": "[\".hoodie/.*\", \"**.commit\"]" } )
原理说明
Glue的exclusions参数接受JSON格式的正则表达式数组,之前的尝试存在两个问题:
- 单独排除目录时,
.hoodie/**的匹配规则不符合Glue的正则语法,改用.hoodie/.*可以精准匹配.hoodie目录下的所有文件及子目录 - 将多个排除规则合并到同一个数组中,用逗号分隔,即可同时过滤HUDI的元数据目录和独立的.commit文件
如果上述方法仍未生效,可以尝试在Athena表的存储配置中直接添加排除路径,或者改用create_dynamic_frame.from_options直接指定S3路径并配置过滤规则。
内容的提问来源于stack exchange,提问作者J Weezy
相关产品推荐
相关产品推荐

