Подтвердить что ты не робот

Обновление, опция SET в Hive

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

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

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

UPDATE temp1
SET location=florida
WHERE id=206;

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

4b9b3361

Ответ 1

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_, ...). Я не делал этого с несколькими разделами, всего по одному, поэтому я проверял результаты на test/dev env, прежде чем делать все разделы сразу. У меня были другие причины для ограничения каждого OVERWRITE на один раздел.

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

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

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

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

Ответ 2

Это может быть хаки, но это сработало для чего-то, что я должен был сделать на работе.

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

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

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