spark中覆盖的行为

Posted

技术标签:

【中文标题】spark中覆盖的行为【英文标题】:Behavior of the overwrite in spark 【发布时间】:2019-12-02 18:03:45 【问题描述】:

我经常在 parquet 文件中上传数据,我使用该文件进行数据分析,并且我想确保 parquet 文件中的数据不重复。我用来执行此操作的命令是:

df.write.parquet('my_directory/', mode='overwrite')

这是否能确保我的所有非重复数据在某些时候不会被意外删除。

干杯

【问题讨论】:

值得注意的是,根据spark.sql.sources.partitionOverwriteMode 之类的设置,覆盖镶木地板分区可能具有不同的功能w.r.t 重复。查看configuration docs here。 【参考方案1】:

顾名思义,它会将整个数据重写到您指定的路径中。 在某种意义上重写,df 中可用的数据将通过删除指定路径中可用的旧文件(如果有)来写入路径。因此,您可以将其视为DELETELOAD 场景,您可以从数据源读取所有记录,比如说Oracle,然后进行转换并删除镶木地板并在数据框中写入新内容。

Dataframe.write 支持将内容写入目标的一系列模式。

mode –

specifies the behavior of the save operation when data already exists.

append: Append contents of this DataFrame to existing data.

overwrite: Overwrite existing data.

ignore: Silently ignore this operation if data already exists.

error or errorifexists (default case): Throw an exception if data already
exists.

如果您打算向镶木地板添加新数据,则必须使用 append,但如果您要处理不断变化的数据,这会带来新的重复挑战。

【讨论】:

【参考方案2】:

这能确保我所有的非重复数据都不会被删除吗 不小心在某个时候。

mode='overwrite' 仅确保如果 target directory 中已存在数据,则现有数据将为 deleted 并写入新数据 (analogous to truncate and load in RDBMS tables)。 如果要确保没有record level duplicates,最简单的做法是:

df1 = df.dropDuplicates()
df1.write.parquet('my_directory/', mode='overwrite')

【讨论】:

以上是关于spark中覆盖的行为的主要内容,如果未能解决你的问题,请参考以下文章

Spark 是不是支持插入覆盖静态分区?

Spark覆盖不会删除目标路径中的文件

Spark覆盖模式和并发执行

如何在 spark scala 中覆盖特定的表分区

多列上的 Spark 动态分区覆盖产生空白输出

使用 Overwrite 模式时 Spark 不会删除 MemSql 中的旧数据