例如,我有一个存储桶,其中有大量Avro数据以“蜂巢”样式进行分区
s3://my-bucket/year=2018/month=03/day=25/file-name.avro
我正在尝试通过以下方式在Glue中访问此数据:
val predicate = "year=2018 and month=03"
val opts = JsonOptions("""{ "paths": ["s3://my-bucket/"], "recurse": true }""")
val src = glueContext.getSource(connectionType = "s3"
, connectionOptions = opts
, pushDownPredicate = predicate
).withFormat("avro")
但是此表达式失败,并带有以下例外:
com.amazonaws.services.glue.util.NonFatalException: User's pushdown predicate: year=2018 and month=03 can not be resolved against partition columns: []
我尝试过这样的事情:
val predicate = "year=2018 and month=3"
val opts = JsonOptions("""{ "paths": ["s3://my-bucket/"], "recurse": true }""")
val src = glueContext.getSourceWithFormat(connectionType = "s3", format="avro", options = opts, pushDownPredicate = predicate)
但它根本不接受下推谓词:
error: unknown parameter name: pushDownPredicate
我也尝试添加
"partitionKeys": ["year", "month", "day"]
也未成功到JsonOptions
。
如何在没有搜寻器的情况下在Glue中读取配置单元分区的Avro序列化数据?
答案 0 :(得分:0)
当前无法在getSource()
和getSourceWithFormat()
中使用下推谓词,因为在内部它会验证expression中的字段是否实际上是分区。在getCatalogSource()
中,它从胶水目录中加载此信息并传递给验证器。对于getSource()
和getSourceWithFormat()
,无法传递用于验证的数据分区的自定义列表,因此无法使用下推谓词。
作为解决方法,您可以生成包含数据分区的路径,并将其通过getSourceWithFormat()
传递到options
中。例如,如果要加载year=2018 and (month=03 or month=04)
的数据,则代码应如下所示:
val paths = Array(
"s3://bucket/data/year=2018/month=03",
"s3://bucket/data/year=2018/month=04"
)
val source = glueContext.getSourceWithFormat(
connectionType = "s3",
format = "avro",
options = JsonOptions(Map(
"paths" -> paths,
"recurse": true
))).getDynamicFrame()
请注意,source
DynamicFrame不会包含分区列year
和month
,因此您可能需要手动添加它们。
答案 1 :(得分:0)
最好的选择是,在my_bucket
上运行搜寻器,然后使用
glue_context.create_dynamic_frame.from_catalog( database =“ my_S3_data_set”, table_name =“ catalog_data_table”, push_down_predicate =谓词)