【问题标题】:Would 'replaceWhere' causes deletion?'replaceWhere' 会导致删除吗?
【发布时间】:2021-05-14 19:37:59
【问题描述】:

在这个命令(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")

【问题讨论】:

标签: apache-spark pyspark apache-spark-sql databricks


【解决方案1】:

这个选项几乎就像一个动态覆盖分区,基本上你告诉 Spark 只覆盖那些范围分区上的数据。另外,只有当你的dataframe符合条件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'))

第二次运行将只过滤偶数行并覆盖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 为偶数:

【讨论】:

猜你喜欢
  • 2021-06-14
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
相关资源
最近更新 更多