У меня есть таблица с разделением, имеющая YEAR, MONTH, DAY
секционирование, но я хочу добавить дополнительное секционирование по INGESTION_KEY
, столбцу, которого нет в существующей таблице. Это сделано для того, чтобы в будущем можно было вставлять таблицы, чтобы мне не приходилось OVERWRITE
YEAR, MONTH, DAY
раздел каждый раз, когда я загружаю данные за эту дату; Я могу сделать простой INSERT INTO
и создать новый INGESTION_KEY
раздел.
Для начала мне нужны данные за год в моей новой таблице, поэтому я хочу скопировать разделы за год из моей существующей таблицы в новую таблицу. Я подумал, что вместо того, чтобы делать INSERT
Hive для каждого раздела, было бы быстрее использовать distcp
для копирования файлов в каталоги разделов новой таблицы в каталоге хранилища Hive в HDFS, а затем ADD PARTITION
в новую таблицу.
Итак, это все, что я делаю:
hadoop distcp /apps/hive/warehouse/src_db.db/src_tbl/year=2017/month=02/day=06 /apps/hive/warehouse/dest_db.db/dest_tbl/year=2017/month=02/day=06/ingestion_key=123
hive -e "ALTER TABLE dest_tbl ADD PARTITION (year=2017,month=02,day=06,ingestion_key='123')"
Обе являются управляемыми таблицами, новая таблица dest_tbl
кластеризована по тому же столбцу в то же количество сегментов, что и src_tbl
, и единственная разница в схеме - это добавление INGESTION_KEY
.
Пока мой SELECT * FROM dest_tbl
показывает, что все в новой таблице выглядит нормально. Итак, мой вопрос: что-то не так с этим подходом? Плохо ли INSERT
использовать управляемую таблицу с разделениями таким образом, или это приемлемая альтернатива INSERT
, если никакие преобразования не выполняются с копируемыми данными?
Спасибо!!
INSERT
, а о операциях резервного копирования / восстановления. Хранилище метаданных Hive отслеживает не файлы данных, а только структуру каталогов; так что пока структура файла соответствует метаданным, это честно. - person Samson Scharfrichter   schedule 06.02.2017