在AWS Glue中读取分区的Avro文件

时间:2018-08-10 01:47:07

标签: amazon-web-services aws-glue

例如,我有一个存储桶,其中有大量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序列化数据?

2 个答案:

答案 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不会包含分区列yearmonth,因此您可能需要手动添加它们。

答案 1 :(得分:0)

最好的选择是,在my_bucket上运行搜寻器,然后使用

  

glue_context.create_dynamic_frame.from_catalog(       database =“ my_S3_data_set”,       table_name =“ catalog_data_table”,       push_down_predicate =谓词)