apache-spark - 'replaceWhere'会导致删除吗?

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

在此命令( 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'))

first dataframe output

第二次运行将仅过滤偶数行并覆盖 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'))

second dataframe output

结果

我的名为 my_delta_table 的表有 505 行,其中 500 行是奇数,5 行是偶数:

final table result

关于apache-spark - 'replaceWhere'会导致删除吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67540077/

相关文章:

apache-spark - PySpark:反序列化包含在 eventhub 捕获 avro 文件中的 Avro 序列化消息

python - 如何在 pyspark 列表达式中引用名称中带有连字符的列?

java - Spark从cassandra获取ttl列

python - Pyspark:重命名 DataFrame 列中的字典键

python - 使用python读取1TB HDFS CSV文件的有效方法是什么

python - Spark VectorAssembler 错误 - PySpark 2.3 - Python

python - 在 SPARK 上将 JSON 对象转换为 DataFrame

python - 具有重复项的类的多标签编码

apache-spark - 如何在 spark 2.4.1 中将 jdbc/partitionColumn 类型设置为 Date

Elasticsearch-hadoop & Elasticsearch-spark sql - 语句扫描和滚动的跟踪