#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;