apache-spark - 使用 SQL 更新 Spark 表中的列
问题描述
我想在表中添加一列,然后用另一个表中的值填充它。以下是我的问题的高度简化版本。
CREATE TABLE table_1 (
id INT,
a DECIMAL(19,2)
)
INSERT INTO TABLE table_1 VALUES (1, 3.0)
INSERT INTO TABLE table_1 VALUES (2, 4.0)
CREATE TABLE table_2 (
id INT,
b DECIMAL(19,2),
c DECIMAL(19,2)
)
INSERT INTO TABLE table_2 VALUES (1, 1.0, 4.0)
INSERT INTO TABLE table_2 VALUES (2, 2.0, 1.0)
-- The next two parts illustrate what I'd like to accomplish
ALTER TABLE table_1 ADD COLUMNS (d Decimal(19,2))
UPDATE table_1
SET d = (table_1.a - table_2.b) / table_2.c
FROM table_2
WHERE table_1.id = table_2.id
最后SELECT * FROM table_1
会产生这样的东西:
+---+----+----+
| id| a| d|
+---+----+----+
| 1|3.00|0.50|
| 2|4.00|2.00|
+---+----+----+
但是,当我运行更新命令时,Spark(2.4 版)立即抱怨更新语句。
UPDATE table_1 ...
^^^
最终,我需要一个与原始表同名并带有新列的表。仅使用 Spark SQL,我可以做些什么来实现我的目标?似乎我无法执行更新,但有没有我可以做的 SQL hack 来完成相同的最终结果?在我的实际问题中,我需要在一个大表中添加大约 100 列,因此该解决方案也不应该降低性能或制作大量数据副本并占用磁盘空间。
重新表述我的问题的另一种方式是,我可以使用 Spark 的开源版本完成 DataBricks 的等效项UPDATE
(参见此处)吗?
解决方案
请记住,Spark 不是数据库。数据框是可以查询的类表引用,但与表不同。您要做的是创建一个视图,将您的表组合成一个类似表的结构,然后保留或使用该视图。
CREATE TEMPORARY VIEW table_3 AS
SELECT t1.a, t2.b, t2.c, (t1.a - t2.b) / t2.c as d
FROM table_1 t1 INNER JOIN table_2 t2
ON t1.id = t2.id
您最终会希望将该视图写回表中,但在添加 100 列中的每一列后,您不需要执行此操作。
推荐阅读
- python - “AttributeError: 'module' object has no attribute” - 有人可以解释这个错误消息的含义吗?
- powerbi - 如何计算已关闭工单的平均工作日?
- angular - 如何加载数据并返回承诺?
- amazon-web-services - AWS Personalize 项目属性
- python - 识别任意时间段内的会话
- excel - VBA 将多个 PDF 文件从一个位置保存到另一个位置
- javascript - date-fns - 从日期开始倒计时,包括周数
- reactjs - 从下拉菜单单击事件触发模态 antd
- php - 在 Wordpress 中显示分类法
- .net-core - MSBUILD:错误 MSB1009:在 SonarQube 服务器上构建项目时项目文件不存在