【问题标题】:Overwrite parquet files from dynamic frame in AWS Glue从 AWS Glue 中的动态框架覆盖镶木地板文件
【发布时间】:2018-08-24 09:47:00
【问题描述】:

我使用动态框架在 S3 中编写 parquet 文件,但如果文件已经存在,我的程序会追加一个新文件而不是替换它。我使用的句子是这样的:

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

有没有像"mode":"overwrite" 这样的东西来代替我的镶木地板文件?

【问题讨论】:

    标签: amazon-web-services parquet aws-glue


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答!
    • 这会替换分区中的所有现有文件吗?还是只是名字冲突的那些?
    • 它会覆盖所有文件
    【解决方案2】:

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

    【讨论】:

    • 谢谢,在看到您使用 spark.conf.set 之前,我无法正常工作。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-12-22
      • 1970-01-01
      • 2019-11-20
      • 2019-02-05
      • 2021-07-07
      • 1970-01-01
      • 2018-09-28
      • 2020-01-20
      • 2018-05-11
      相关资源
      最近更新 更多