本文介绍了替换';会导致删除吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在此命令(taken from)中,replaceWhere
是否会导致删除记录?命令中提到的日期范围有1000行。新的东风只有100家。这是否会导致删除900条记录?
df.write
.format("delta")
.mode("overwrite")
.option("replaceWhere", "date >= '2017-01-01' AND date <= '2017-01-31'")
.save("/mnt/delta/events")
推荐答案
此选项的工作方式与动态覆盖分区几乎相同,基本上您是在告诉Spark只覆盖那些范围分区上的数据。此外,只有当您的数据帧与条件replaceWhere
匹配时,才会保存数据,否则,如果一行不匹配,将抛出异常Data written out does not match replaceWhere
。
Q: Would this cause a deletion of 900 records?
A: Yes, it would delete.
我测试了如何创建一个包含2列的数据帧
root
|-- number: long (nullable = true)
|-- even: integer (nullable = true)
第一次运行将节省1000行,其中500行为偶数行,500行为奇数行:
rows = [Row(number=i) for i in range(0, 1000)]
df = spark.createDataFrame(rows)
df = df.withColumn('even', (f.col('number') % 2 == f.lit(0)).cast('int'))
(df
.write
.partitionBy('even')
.format('delta')
.saveAsTable('my_delta_table'))
第二次运行将只过滤偶数行并覆盖分区whereeven=1
:
rows = [Row(number=i) for i in range(0, 10)]
df_only_even = spark.createDataFrame(rows)
df_only_even = df_only_even.withColumn('even', (f.col('number') % 2 == f.lit(0)).cast('int'))
# It is required to filter your dataframe or will throw an error during write operation
df_only_even = df_only_even.where(f.col('even') == f.lit(1))
(df_only_even
.write
.partitionBy('even')
.format('delta')
.option('replaceWhere', 'even == 1')
.mode('overwrite')
.saveAsTable('my_delta_table'))
结果
我的表my_delta_table
有505行,其中500是奇数,5是偶数:
这篇关于替换';会导致删除吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!