更改列后,如何使用
SparkR::saveAsTable()
再次以与现有表相同的名称保存 R 数据框?
我正在使用 R 处理 databricks,并将 R 数据框
table_x
保存为数据库中的表,使用以下方法:
data_x <- SparkR::createDataFrame(table_x)
SparkR::saveAsTable(data_x, tableName="table_x", mode = "overwrite")
后来我向表中添加了列,并更改了一些列名称。当我尝试再次保存它时,它不起作用,并且错误消息显示架构不匹配,即使我使用“删除表”从数据库中删除了
table_x
。
如果我尝试
data_x <- SparkR::createDataFrame(table_x)
SparkR::saveAsTable(data_x, tableName="table_x", mode = "error")
错误消息显示:“关联位置 (...) 不为空,也不是 Delta 表。”
所以即使我删除了
table_x
,它的位置也不为空并且它的表模式仍然存在?
错误消息下方显示:
To overwrite your schema or change partitioning, please set:
'.option("overwriteSchema", "true")'.
如何在
SparkR::saveAsTable
中执行此操作? RDocumentation 网站说可以将其他选项传递给该方法,但我到底该怎么做呢?
非常简单,只需将这个参数
overwriteSchema = "true"
添加到函数SparkR::saveAsTable
中即可。查看 ...
函数的
SparkR::saveAsTable
参数的文档,其中显示“传递给方法的附加选项”。
如果您不知道
...
参数是如何工作的,请查看 Hadley Wickham 的有关 Advanced R 的书,https://adv-r.hadley.nz/functions.html#fun-dot-dot-dot
这里的观察结果是,默认情况下,所有 Spark 数据帧都以 Delta 格式而不是 Parquet 保存,并且 Delta 格式强制执行架构一致性,这是众多好处之一。
计算出的例子:
data_x <- SparkR::createDataFrame(iris)
SparkR::saveAsTable(data_x, tableName="table_x", mode = "overwrite")
# modify dataframe
data_x_mod <- data_x |>
SparkR::withColumn("col_x", SparkR::lit(1)) |>
SparkR::withColumn("Sepal_Length", data_x$Sepal_Length * 2)
# try to overwrite at same location - results in ERROR
SparkR::saveAsTable(data_x_mod, tableName="table_x", mode = "overwrite")
# Error in handleErrors(returnStatus, conn) :
# org.apache.spark.sql.AnalysisException: A schema mismatch detected when writing to the Delta table ...
# Add mergeSchema or overwriteSchema option as needed - executes WITHOUT ERROR
SparkR::saveAsTable(data_x_mod, tableName="table_x", mode = "overwrite", overwriteSchema = "true")