使用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
文件夹及其子文件夹的所有内容再次被覆盖。
答案 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)