AWS Glue编写具有分区的镶木地板

ste*_*t99 6 amazon-web-services apache-spark pyspark aws-glue

我能够写成实木复合地板格式,并按如下所示进行分区:

jobname = args['JOB_NAME']
#header is a spark DataFrame
header.repartition(1).write.parquet('s3://bucket/aws-glue/{}/header/'.format(jobname), 'append', partitionBy='date')
Run Code Online (Sandbox Code Playgroud)

但是我无法使用Glue的DynamicFrame做到这一点。

header_tmp = DynamicFrame.fromDF(header, glueContext, "header")
glueContext.write_dynamic_frame.from_options(frame = header_tmp, connection_type = "s3", connection_options = {"path": 's3://bucket/output/header/'}, format = "parquet")
Run Code Online (Sandbox Code Playgroud)

我已经尝试将dict partitionBy作为connection_optionsdict 的一部分进行传递,因为AWS文档说镶木地板Glue不支持任何格式选项,但是那没有用。

这有可能吗?至于这样做的原因,我认为工作书签需要工作,因为这目前对我而言不起作用。

ste*_*t99 5

从AWS支持(换个说法):

到目前为止,Glue在写入镶木地板时不支持partitionBy参数。不过,这还在进行中。

要使工作书签功能与S3源一起使用,需要使用Glue API写入拼花地板。

因此,到目前为止,无法对镶木地板文件进行分区启用作业书签功能。

编辑:今天(3/23/18)我在文档中找到了:

glue_context.write_dynamic_frame.from_options(
frame = projectedEvents,
connection_options = {"path": "$outpath", "partitionKeys": ["type"]},
format = "parquet")
Run Code Online (Sandbox Code Playgroud)

该选项可能一直存在,我本人和AWS支持人员都错过了它,或者只是最近才添加的。无论哪种方式,似乎现在都有可能。

  • 以下是最新胶水文档的引文:“直到最近,将DynamicFrame写入分区的唯一方法是在写入之前将其转换为Spark SQL DataFrame。但是,DynamicFrames现在支持使用一系列键,使用创建接收器时使用partitionKeys选项。”。是的,它是最近才添加的 (5认同)

小智 5

我使用数据框中的一些列作为partionkeys对象:

glueContext.write_dynamic_frame \
    .from_options(
        frame = some_dynamic_dataframe, 
        connection_type = "s3", 
        connection_options =  {"path":"some_path", "partitionKeys": ["month", "day"]},
        format = "parquet")
Run Code Online (Sandbox Code Playgroud)