Проектирование улья - PullRequest
1 голос
/ 19 марта 2019

Я пытаюсь найти лучший способ реализовать следующий конвейер в Hive и HDFS:

Я хотел бы использовать CSV (пока проблем нет), но я хочу, чтобы разделыбыть сделанным из поля, которое поступает в файлы csv.

Я создал внешнюю таблицу, которая помещает файл в HDFS, и определил поле раздела, но с простым выражением (что имеет смысл), разделыне сделан, и я получаю код выхода 1 при попытке удалить таблицу восстановления msck.

Я хотел бы знать, возможно ли или целесообразно ли выполнить следующее:

  1. Загрузите файл CSV во внутреннюю таблицу кустов и в качестве временной таблицы.

  2. Выполните вставку в "официальную" таблицу с разделами

Это эффективный способ сделать это?Если это так, я не нашел много информации о том, как сделать первый.

Спасибо.

1 Ответ

1 голос
/ 22 марта 2019

Если бы это был только один раздел на файл, то вы могли бы загрузить непосредственно в целевой раздел таблицы, используя

hive> LOAD DATA LOCAL INPATH 'yourpath/yourfile.csv' OVERWRITE INTO TABLE your_table PARTITION (key='value');

Наихудший сценарий Если в файле много разделов, вам нужно сначала загрузить в промежуточную таблицу изатем повторно разделите данные, используя insert-overwrite-select:

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

insert overwrite official_table partition(partition_key) 
 select col1, col2, partition_col --partition is the last one
from intermediate table... 

И вам нужно загрузить (перезаписать) все данные всего раздела за раз, если это невозможно, тогда select должен объединить данные, уже существующие в целевом разделе, синкрементная загрузка.

См. этот ответ о том, как объединить инкрементные обновления .

Также INSERT (NOT OVERWRITE) INTO table (partition) select ... является возможным решением для вставки инкрементных данных.Этот оператор должен загружать данные в дополнительные файлы в папке раздела, существующие данные останутся без изменений.

...