使用Pyspark覆盖一个Parquet文件

3

我正在尝试使用Pyspark覆盖S3中的Parquet文件。该桶启用了版本控制。

我正在使用以下代码:

写入 v1:

df_v1.repartition(1).write.parquet(path='s3a://bucket/file1.parquet')

更新 v2:
df_v1 = spark.read.parquet("s3a://bucket/file1.parquet")
df_v2 = df_v1.... <- transform
df_v2.repartition(1).write.mode("overwrite").parquet('s3a://bucket/file1.parquet')

但是当我读取df_v2时,它包含了来自两个写操作的数据。此外,在写入df_v1后,我可以看到一个part-xxx.snappy.parquet文件,而在写入df_v2后,我可以看到两个文件。它的行为类似于追加而不是覆盖。

我错过了什么?谢谢。

Spark = 2.4.4 Hadoop = 2.7.3

1个回答

3
问题可能来自于您正在使用S3。 在S3中,文件系统是基于键值的,这意味着没有名为file1.parquet的实际文件夹,只有其键的文件,类似于s3a://bucket/file1.parquet/part-XXXXX-b1e8fd43-ff42-46b4-a74c-9186713c26c6-c000.parquet(这只是一个示例)。
因此,当您“覆盖”时,您应该覆盖文件夹,但无法检测到它。因此,Spark会创建新的键:这就像一种“追加”模式。
您可能需要编写自己的函数来覆盖整个“文件夹”-删除所有包含文件夹名称的键。

是的,我怀疑你是对的。虽然如此,我不想删除文件,这正是我试图避免的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接