如何将 '.option("overwriteSchema", "true")' 添加到 SparkR 中的 saveAsTable()

问题描述 投票:0回答:1

更改列后,如何使用

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 网站说可以将其他选项传递给该方法,但我到底该怎么做呢?

r databricks sparkr
1个回答
0
投票

非常简单,只需将这个参数

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")
© www.soinside.com 2019 - 2024. All rights reserved.