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
中可用的数据将通过删除指定路径中可用的旧文件(如果有)来写入路径。因此,您可以将其视为DELETE
和LOAD
场景,您可以从数据源读取所有记录,比如说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中覆盖的行为的主要内容,如果未能解决你的问题,请参考以下文章