从AWS Glue中的动态框架覆盖镶木地板文件

Mat*_*Rod 9 amazon-web-services parquet aws-glue

我使用动态帧在S3中编写一个镶木地板文件,但如果文件已经存在,我的程序会附加一个新文件而不是替换它.我使用的句子是这样的:

glueContext.write_dynamic_frame.from_options(frame = table,
                                         connection_type = "s3",
                                         connection_options = {"path": output_dir,
                                                               "partitionKeys": ["var1","var2"]},
                                         format = "parquet")
Run Code Online (Sandbox Code Playgroud)

有什么东西"mode":"overwrite"可以替换我的镶木地板文件吗?

Yur*_*ruk 16

目前AWS Glue不支持"覆盖"模式,但他们正在开发此功能.

作为一种解决方法,您可以将DynamicFrame对象转换为spark的DataFrame,并使用spark而不是Glue编写它:

table.toDF()
  .write
  .mode("overwrite")
  .format("parquet")
  .partitionBy("var_1", "var_2")
  .save(output_dir)
Run Code Online (Sandbox Code Playgroud)

  • 它将覆盖所有文件 (4认同)
  • 感谢您的回答! (2认同)

小智 13

如前所述,AWS Glue 不支持 mode="overwrite" 模式。但是将 Glue Dynamic Frame 转换回 PySpark 数据帧可能会导致大数据出现很多问题。

您只需要在将dynamic_dataFrame写入S3之前添加signle命令,即purge_s3_path()。

glueContext.purge_s3_path(s3_path,  {"retentionPeriod": 0})
glueContext.write_dynamic_frame.from_options(frame = table,
                                     connection_type = "s3",
                                     connection_options = {"path": s3_path,
                                                           "partitionKeys": ["var1","var2"]},
                                     format = "parquet")
Run Code Online (Sandbox Code Playgroud)

请参考:AWS文档


Zac*_*ach 5

如果您不希望进程覆盖“s3://bucket/table_name”下的所有内容,您可以使用

spark.conf.set("spark.sql.sources.partitionOverwriteMode","dynamic")
data.toDF()
    .write
    .mode("overwrite")
    .format("parquet")
    .partitionBy("date", "name")
    .save("s3://folder/<table_name>")
Run Code Online (Sandbox Code Playgroud)

这只会更新该 S3 位置中的“选定”分区。就我而言,我的 DynamicFrame“数据”中有 30 个日期分区。

我正在使用 Glue 1.0 - Spark 2.4 - Python 2。