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

时间:2018-08-24 09:47:01

标签: 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")

是否有"mode":"overwrite"之类的东西可以代替我的实木复合地板文件?

3 个答案:

答案 0 :(得分:10)

当前,AWS Glue不支持“覆盖”模式,但是他们正在使用此功能。

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

table.toDF()
  .write
  .mode("overwrite")
  .format("parquet")
  .partitionBy("var_1", "var_2")
  .save(output_dir)

答案 1 :(得分:1)

如果您不希望进程覆盖“ 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>")

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

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

答案 2 :(得分:0)

在保存新的镶木地板文件之前,您可以删除现有的镶木地板文件所在的路径。

您可以使用简单的 python boto3 代码删除。