具有下推谓词的 AWS Glue Dynamic_frame 未正确过滤
Posted
技术标签:
【中文标题】具有下推谓词的 AWS Glue Dynamic_frame 未正确过滤【英文标题】:AWS Glue Dynamic_frame with pushdown predicate not filtering correctly 【发布时间】:2019-10-29 13:27:20 【问题描述】:我正在为 AWS Glue 编写一个脚本,该脚本来源于 S3 存储的 parquet 文件,我正在其中创建一个 DynamicFrame 并尝试使用 pushDownPredicate 逻辑来限制传入的数据。
表分区(按顺序):account_id > region > vpc_id > dt
而创建dynamic_frame的代码如下:
dynamic_frame = glueContext.create_dynamic_frame.from_catalog(
database = DATABASE_NAME,
table_name= TABLE_NAME,
push_down_predicate = "dt='" + DATE + "'")
在哪里DATE = '2019-10-29'
但是,Glue 似乎仍在尝试读取其他日子的数据。也许是因为我必须为其他条件指定 push_down_predicate?
【问题讨论】:
“但是 Glue 似乎仍在尝试读取其他日子的数据”。您是否从日志中验证了这一点? 日志输出显示以下目录正在考虑:s3://route/account_id=XXX/region=eu-west-1/vpc_id=YYY/dt=2019-07-15 s3://route/account_id=XXX/region=eu-west-1/vpc_id=YYY//dt=2019-10-03 s3://route/account_id=XXX/region=eu-west-1/vpc_id=YYY//dt=2019-08-27 s3://route/account_id=XXX/region=eu-west-1/vpc_id=YYY//dt=2019-10-29 ...
问题是旧文件有不同的分区配置
您是否尝试过为所有分区传递值?因为当您仅传递日期时,Glue 不会自动知道必须从哪个 account_id > region > vpc_id 中提取日期。因此,请尝试传递所有 4 个分区值,然后仅将一个分区加载到 Glue 作业。
【参考方案1】:
根据 cmets,日志显示日期分区列被标记为“dt”,而在您的表中它被称为“日期”
日志
s3://route/account_id=XXX/region=eu-west-1/vpc_id=YYY/dt=2019-07-15
s3://route/account_id=XXX/region=eu-west-1/vpc_id=YYY//dt=2019-10-03
s3://route/account_id=XXX/region=eu-west-1/vpc_id=YYY//dt=2019-08-27
s3://route/account_id=XXX/region=eu-west-1/vpc_id=YYY//dt=2019-10-29 ...
您的代码
dynamic_frame = glueContext.create_dynamic_frame.from_catalog(
database = DATABASE_NAME,
table_name= TABLE_NAME,
push_down_predicate = "date='" + DATE + "'")
将表中的 date 分区列名称更改为 dt 并在上面的 push_down_predicate 参数中相同代码。
我还在上述日志中的某些路径中看到了额外的正斜杠,这些分区是通过 athena 使用 ALTER TABLE 命令手动添加的吗?如果是这样,我建议使用 MSCK REPAIR 命令加载表中的所有分区以避免此类问题。 S3 路径中额外的空白斜杠有时会导致在通过 spark 进行 ETL 时出错。
【讨论】:
以上是关于具有下推谓词的 AWS Glue Dynamic_frame 未正确过滤的主要内容,如果未能解决你的问题,请参考以下文章