具有下推谓词的 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 未正确过滤的主要内容,如果未能解决你的问题,请参考以下文章

创建没有下推谓词的动态框架问题

AWS Glue - 是不是使用爬虫

AWS Glue 作业内存不足

AWS Glue 需要很长时间才能完成

谓词下推

谓词下推