首页 > 解决方案 > 具有下推谓词的 AWS Glue Dynamic_frame 未正确过滤

问题描述

我正在为 AWS Glue 编写一个脚本,该脚本来源于 S3 存储的镶木地板文件,我在其中创建了一个 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?

标签: amazon-web-servicesapache-sparkapache-spark-sqlaws-glue

解决方案


根据评论,日志显示日期分区列被标记为“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 + "'")

将表中的日期分区列名称更改为dt,并且在上述代码中的 push_down_predicate 参数中更改为相同。

我还在上述日志中的某些路径中看到了额外的正斜杠,这些分区是通过 athena 使用 ALTER TABLE 命令手动添加的吗?如果是这样,我建议使用 MSCK REPAIR 命令加载表中的所有分区以避免此类问题。S3 路径中的额外空白斜杠有时会在通过 spark 执行 ETL 时导致错误。


推荐阅读