Возможно ли объединить столбец из таблицы B в таблицу A без создания новой таблицы C в Hive SQL?

#join #hive

#Присоединиться #улей

Вопрос:

Я работаю с очень большими таблицами в Hive, поэтому я хотел бы избежать необходимости создавать целую новую таблицу при соединении одного столбца из таблицы 2 в таблицу 1.

Мой первый проход с использованием инструкций INSERT и UPDATE со следующими тестовыми данными не сработал.

Есть ли способ сделать это или проще просто создать таблицу 3, присоединив таблицу 1 к таблице 2, а затем удалив таблицу 1?

 DROP TABLE IF EXISTS table_1;
CREATE TABLE table_1 (id VARCHAR(64), cost INT, dia&_cd VARCHAR(64));
INSERT INTO TABLE table_1
  VALUES ('A0001', 1000, 'A1'), ('A0001', 2000, 'B1'), ('A0001', 3000, 'B1'), 
  ('B0001', 5000, 'A1'), ('B0001', 10000, 'B1'), ('B0001', 15000, 'C1'),
  ('C0001', 11000, 'B1'), ('C0001', 14000, 'C1'), ('C0001', 20000, 'C1');

DROP TABLE IF EXISTS table_2;
CREATE TABLE table_2 (id VARCHAR(64), prodt_cd VARCHAR(64));
INSERT INTO TABLE table_2
  VALUES ('A0001', 'OAP'), ('B0001', 'OAPIN'), ('C0001', 'MOAPIN');

INSERT INTO TABLE table_1 prodt_cd VARCHAR(64);
UPDATE table_1 t1 SET t1.prodt_cd = t2.prodt_cd
INNER JOIN table_2 t2 
ON t1.id = t2.id;
  

Комментарии:

1. Вы получаете ошибку при выполнении этого теста? Последняя вставка выглядит неправильно. Для добавления столбца используйте ALTER TABLE table_1 ADD COLUMNS (prodt_cd VARCHAR(64));

2. @Mike67 Спасибо — я изменил инструкцию INSERT на инструкцию ALTER TABLE, которая работает нормально, но когда я запускаю следующие 3 строки, я получаю ошибку: «Ошибка при компиляции инструкции: СБОЙ: ParseException строка 29:126 посторонний ввод ‘t1’, ожидающий установки рядом с ‘t1’ в инструкции update строка 1:52 несоответствующий ввод ‘.’ ожидающий = рядом с ‘t1’ в инструкции update».

3. Нашел похожие вопросы в Интернете — похоже, Hive не поддерживает обновления столбцов таким образом?

4. Возможно, это просто проблема с синтаксисом. Попробуйте это: UPDATE t1 SET t1.prodt_cd = t2.prodt_cd FROM table_1 t1 INNER JOIN table_2 t2 ON t1.id = t2.id;

5. Извините — моя ошибка. Hive поддерживает только слияние. Попробуйте это: MERGE INTO table_1 t1 USING table_2 t2 ON t1.id=t2.id WHEN MATCHED THEN UPDATE SET prodt_cd=t2.prodt_cd;

Ответ №1:

После некоторых исследований и помощи от Mike67 я нашел решение.

Похоже, что Hive не поддерживает инструкции ОБНОВЛЕНИЯ СТОЛБЦА или СЛИЯНИЯ, но простой альтернативой является создание пустой таблицы, а затем заполнение ее полями из объединения:

 DROP TABLE IF EXISTS table_3; 
CREATE TABLE table_3 LIKE table_1; 

INSERT INTO TABLE table_3 
SELECT a.*, b.prodt_cd
FROM table_1 AS a 
LEFT OUTER JOIN table_2 AS b 
ON a.id = b.id;