Обновление столбца в таблице Spark с использованием SQL - PullRequest
0 голосов
/ 01 марта 2019

Я хотел бы добавить столбец в таблицу, а затем заполнить его значениями из другой таблицы.Ниже приведена упрощенная версия моей проблемы.

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, которые я могу сделать, чтобы достичь того же конечного результата?В моей реальной проблеме мне нужно добавить около 100 столбцов в большую таблицу, поэтому решение также не должно снижать производительность или делать много копий данных и занимать место на диске.

Другой способ перефразироватьу меня вопрос, могу ли я выполнить DataBricks, эквивалентный UPDATE (см. здесь ), используя версию Spark с открытым исходным кодом?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Помните, что 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 столбцов.

0 голосов
/ 01 марта 2019

Один из способов - создать 2 временные таблицы, заполнить их, а затем объединить, чтобы создать финальную таблицу.Общие шаги и (непроверенный) код приведены ниже.

1) Создание временных таблиц

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) Создание финальной таблицы

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...