Spark:如何覆盖S3文件夹上的文件而不是完整的文件夹

时间:2019-07-09 06:38:31

标签: apache-spark amazon-s3 apache-spark-2.0

使用Spark我正在尝试将一些数据(csv,镶木地板格式)推送到S3存储桶。

df.write.mode("OVERWRITE").format("com.databricks.spark.csv").options(nullValue=options['nullValue'], header=options['header'], delimiter=options['delimiter'], quote=options['quote'], escape=options['escape']).save(destination_path)

在以上代码段中,destination_path变量保存需要将数据导出到的S3存储桶位置。

例如。 destination_path = "s3://some-test-bucket/manish/"

manish的文件夹some-test-bucket中,如果我有多个文件和子文件夹。上面的命令将删除所有这些文件,并且spark将写入新的输出文件。但是我只想用这个新文件覆盖一个文件。

即使我能够仅覆盖此文件夹的内容,但即使在一定程度上可以解决问题,子文件夹也将保持不变。

如何实现?

我尝试使用mode作为附加,而不是覆盖。

在这种情况下,子文件夹名称保持不变,但manish文件夹及其子文件夹的所有内容再次被覆盖。

1 个答案:

答案 0 :(得分:0)

简短答案:将Spark配置参数spark.sql.sources.partitionOverwriteMode设置为dynamic而不是静态参数。这只会覆盖必要的分区,而不会覆盖所有分区。 PySpark示例:

conf=SparkConf().setAppName("test).set("spark.sql.sources.partitionOverwriteMode","dynamic").setMaster("yarn")
sc = SparkContext(conf=conf)
sqlContext = sql.SQLContext(sc)