AWS Glue作业用create_dynamic_frame.from_catalog访问分区投影表数据失败如何解决
问题根因
分区投影是Athena原生提供的特性,相关分区配置仅被Athena查询引擎识别。Glue默认的create_dynamic_frame.from_catalog逻辑只会拉取Glue元数据中预先注册的分区列表,不会自动解析表的分区投影配置,因此在未手动注册分区的场景下会识别不到任何数据路径,返回0条记录。
无需预注册Glue分区的解决方案
方案1:Glue 4.0及以上版本直接开启分区投影支持
Glue 4.0及更高版本已经内置了分区投影配置识别能力,仅需在读取catalog表时新增allowPartitionProjection参数即可,代码示例:
data = glueContext.create_dynamic_frame.from_catalog( database="db", table_name="a_table", additional_options = {"allowPartitionProjection": "true"} ) print(data.count())
该方案改动最小,可完全复用现有表的分区投影配置。
方案2:直接读取S3路径并开启分区推断
如果你使用的是低于4.0的Glue版本,可以绕过Glue Catalog直接读取S3数据路径,手动开启分区推断自动识别路径中的分区字段,代码示例:
data = glueContext.create_dynamic_frame.from_options( connection_type="s3", connection_options={ "paths": ["s3://<你的表数据根路径>/"], "recurse": True }, format="<你的数据格式,如parquet、csv>", format_options={"withPartition": "true"} ) print(data.count())
方案3:通过Athena数据源查询数据
直接在Glue中调用Athena执行查询,完全复用Athena的查询逻辑,不存在兼容性问题,代码示例:
athena_source = glueContext.read.format("athena")\ .option("database", "db")\ .option("query", "select * from a_table")\ .option("output_location", "s3://<你的Athena查询结果存放路径>/") data = athena_source.load() print(data.count())
内容的提问来源于stack exchange,提问作者Stagg
相关产品推荐
相关产品推荐

