web-dev-qa-db-fra.com

Écraser les fichiers de parquet du cadre dynamique dans AWS Glue

J'utilise des cadres dynamiques pour écrire un fichier parquet dans S3, mais si un fichier existe déjà, mon programme ajoute un nouveau fichier au lieu de le remplacer. La phrase que j'utilise est la suivante:

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

Y a-t-il quelque chose comme "mode":"overwrite" qui remplacent mes limes parquet?

8
Mateo Rod

Actuellement, AWS Glue ne prend pas en charge le mode `` écraser '', mais ils travaillent sur cette fonctionnalité.

Pour contourner ce problème, vous pouvez convertir l'objet DynamicFrame en DataFrame de spark et l'écrire en utilisant spark au lieu de Glue:

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

Si vous ne voulez pas que votre processus écrase tout sous "s3: // bucket/table_name", vous pouvez utiliser

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

Cela ne mettra à jour que les partitions "sélectionnées" dans cet emplacement S3. Dans mon cas, j'ai 30 partitions de date dans mes "données" DynamicFrame.

J'utilise Glue 1.0 - Spark 2.4 - Python 2.

1
Zach