在此命令( taken from )中 replaceWhere
会导致删除记录吗?
例如:命令中提到的日期范围有 1000 行。新的df只有100条,会不会导致删除900条记录?
df.write \
.format("delta") \
.mode("overwrite") \
.option("replaceWhere", "date >= '2017-01-01' AND date <= '2017-01-31'") \
.save("/mnt/delta/events")
最佳答案
此选项的工作方式几乎类似于动态覆盖分区,基本上您是在告诉 Spark 仅覆盖这些范围分区上的数据。另外,只有当你的dataframe符合条件replaceWhere
时才会保存数据,否则,如果单行不匹配,则会出现异常Data write out does not match replacementWhere
被扔掉。
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'))
第二次运行将仅过滤偶数行并覆盖 even=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 行是偶数:
关于apache-spark - 'replaceWhere'会导致删除吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67540077/