Обновление, опция SET в Hive - PullRequest
14 голосов
/ 01 июня 2011

Я знаю, что в Hadoop нет обновления файла, но в Hive возможно с помощью синтаксического сахара объединить новые значения со старыми данными в таблице, а затем переписать таблицу с объединенным выводом, но если у меня будет новыйзначения в другой таблице, тогда я могу добиться того же эффекта, используя левое внешнее соединение.

Проблема в моем случае заключается в том, что мне нужно обновить таблицу, установив одно значение для столбца с некоторым условием where,Известно, что SET не поддерживается.

Например, рассмотрим следующий обычный запрос:

UPDATE temp1
SET location=florida
WHERE id=206;

Я пытался преобразовать то же самое в Hive, но застрял на местеSET.Если кто-нибудь и даст мне знать, это будет для меня большой помощью.

Ответы [ 2 ]

10 голосов
/ 01 июня 2011
INSERT OVERWRITE TABLE _tableName_ PARTITION (_partitionColumn_= _partitionValue_) 
SELECT [other Things], CASE WHEN id=206 THEN 'florida' ELSE location END AS location, [other Other Things] 
FROM _tableName_ WHERE [_whereClause_];

Можно указать несколько разделов, разделив их запятыми. ... PARTITION (_partitionColumn_= _partitionValue1_, _partitionColumn_= _partitionValue2_, ...). Я не делал этого с несколькими разделами, по одному за раз, поэтому я проверял результаты в тестовой / dev-среде, прежде чем делать все разделы одновременно. У меня были и другие причины ограничить каждый OVERWRITE одним разделом.

На этой странице https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML есть еще немного.
Этот сайт https://cwiki.apache.org/confluence/display/Hive/LanguageManual, в целом является вашим лучшим другом при работе с HiveSQL.

Я разработал нечто идентичное этому для переноса некоторых данных, и это сработало. Я не пробовал его для больших наборов данных, всего несколько ГБ, и он отлично работал.

Чтобы отметить - Это будет ПЕРЕЗАПИСАТЬ раздел. Это сделает предыдущие файлы до свидания. Создание сценариев / процедур резервного копирования и восстановления. [other Things] и [other Other Things] - остальные столбцы таблицы. Они должны быть в правильном порядке. Это очень важно, иначе ваши данные будут повреждены.

Надеюсь, это поможет. :)

1 голос
/ 26 февраля 2013

Это может быть хакерским, но это сработало для тех вещей, которые мне приходилось делать на работе.

    INSERT OVERWRITE TABLE tabletop PARTITION(partname = 'valueIwantToSet')
    SELECT things FROM databases.tables WHERE whereclause;

Как и следовало ожидать, это разбивает ваши данные на разделы, но если распределение значения, которое вы хотите установить, пропорционально «хорошим размерам порций данных» (это вам решать), то ваши запросы к этим данным будет лучше оптимизирован

@ Jothi: Не могли бы вы опубликовать запрос, который вы использовали?

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