首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SQL更新Spark表中的列

使用SQL更新Spark表中的列
EN

Stack Overflow用户
提问于 2019-03-01 06:07:10
回答 2查看 1.5K关注 0票数 0

我想向表中添加一列,然后用另一个表中的值填充它。下面是我的问题的一个高度简化的版本。

代码语言:javascript
复制
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会产生类似这样的结果:

代码语言:javascript
复制
+---+----+----+
| id|   a|   d|
+---+----+----+
|  1|3.00|0.50|
|  2|4.00|2.00|
+---+----+----+

然而,当我运行update命令时,Spark (2.4版)立即抱怨update语句。

代码语言:javascript
复制
UPDATE table_1 ...
^^^

最终,我需要一个与原始表同名并包含新列的表。只使用Spark SQL,我可以做些什么来实现我的目标?看起来我不能执行更新,但是有没有SQL hack可以实现同样的最终结果呢?在我的实际问题中,我需要向一个大表中添加大约100列,因此该解决方案也不应该拖累性能,也不应该制作大量数据副本并占用磁盘空间。

我的问题的另一种表达方式是,我可以使用Spark的开源版本实现UPDATE的DataBricks等价物(请参阅here)吗?

EN

回答 2

Stack Overflow用户

发布于 2019-03-01 09:34:48

请记住,Spark不是一个数据库;dataframe是可以查询的表状引用,但与表不同。您要做的是创建一个视图,该视图将您的表组合到一个类似表的结构中,然后持久化或使用该视图。

代码语言:javascript
复制
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列中的每一列之后执行此操作。

票数 1
EN

Stack Overflow用户

发布于 2019-03-01 07:29:24

一种方法是创建2个临时表,填充这些临时表,然后连接这些临时表以创建最终的表。一般步骤和(未测试的)代码如下。

1)创建临时表

代码语言:javascript
复制
CREATE TEMPORARY TABLE temp_table_1 (
   id INT,
   a DECIMAL(19,2)
)

INSERT INTO TABLE temp_table_1 VALUES (1, 3.0)
INSERT INTO TABLE temp_table_1 VALUES (2, 4.0)

CREATE TEMPORARY TABLE temp_table_2 (
   id INT,
   b DECIMAL(19,2),
   c DECIMAL(19,2)
)

INSERT INTO TABLE temp_table_2 VALUES (1, 1.0, 4.0)
INSERT INTO TABLE temp_table_2 VALUES (2, 2.0, 1.0)

2)创建最终的表

代码语言:javascript
复制
CREATE TABLE table_1 
AS
SELECT t1.id, t1.a, t2.b, (t1.a - t1.b) / t2.c as d
FROM table_1 AS t1
JOIN table_2 AS t2 ON t1.id = t2.id
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54935022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档