Spark SQL 中的更新查询

Posted

技术标签:

【中文标题】Spark SQL 中的更新查询【英文标题】:update query in Spark SQL 【发布时间】:2016-05-30 03:54:25 【问题描述】:

我想知道我可以像使用 sparksql 中的更新查询一样:

sqlContext.sql("update users set name = '*' where name is null")

我得到了错误:

org.apache.spark.sql.AnalysisException: 
Unsupported language features in query:update users set name = '*' where name is null

如果 sparksql 不支持更新查询还是我写错了代码?

【问题讨论】:

可能是版本问题 我使用 spark-1.6.1。 【参考方案1】:

Spark SQL 还不支持UPDATE 语句。

Hive 从 hive 0.14 版开始支持UPDATE。但即使使用 Hive,它也仅支持对那些支持 事务 的表进行更新/删除,hive documentation 中提到了这一点。

查看数据块论坛中的答案,确认 UPDATES/DELETES are not supported in Spark SQL 与 doesn't support transactions 相同。如果我们认为,对于大数据中的大多数存储格式,支持随机更新是非常复杂的。它需要扫描巨大的文件、更新特定的记录并重写潜在的 TB 数据。这不是正常的 SQL。

【讨论】:

Spark 项目中有一个 open ticket 以改进对 Hive 事务表(即支持更新的 Hive 表)的支持issues.apache.org/jira/browse/SPARK-15348 现在是否支持这方面的任何新更新?或任何替代方法?【参考方案2】:

现在可以使用Databricks Delta Lake

【讨论】:

【参考方案3】:

如果基础表是增量格式,Spark SQL 现在支持更新、删除和此类数据修改操作。

检查一下: https://docs.delta.io/0.4.0/delta-update.html#update-a-table

【讨论】:

以上是关于Spark SQL 中的更新查询的主要内容,如果未能解决你的问题,请参考以下文章

spark-sql 中的更新语句

如果不存在则插入 Spark SQL 中的其他更新

Spark SQL 查询以获取在 AWS S3 中存储为 CSV 的 Athena 表的最后更新时间戳

使用 SQL 更新 Spark 表中的列

如何使用 Spark sql 在 Databricks 中使用内部联接更新 Databricks Delta 表

Spark 从另一个表更新 Delta 中的多个列