Динамическая секционированная таблица в кусте не обновляет последние разделы

У меня есть папка в ведре gcs со структурой папок как

Xyz/Abc/dt=03-12-2021/file_03-12-2021.csv
Xyz/Abc/dt=04-12-2021/file_04-12-2021.csv

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

Set hive.exec.dynamic.partition.mode=nonstrict
Set hive.exec.dynamic.partition=true


Create table tabName (sno int, city string, address string) partitioned by (dt string);

Create table tabStg (sno int, city string, address string, dt string) row format delimited fields terminated by ‘|’ stored as textfile location ‘gcs://Xyz/Abc’;

Insert overwrite table tabName partition(dt) select sno,city,address,dt from tabStg;

После выполнения инструкции вставки я получаю сообщение как

Загрузка данных в таблицу db.tabName (dt = null)

И если я запрошу как show partitions tabName;, я получу все разделы там. Однако, если новая папка создается в корзине gcs для новой даты, секционированная таблица не может это идентифицировать.

Любые предложения, почему это происходит. Я что-нибудь упускаю


person BigDataEnthusiast    schedule 20.03.2021    source источник


Ответы (1)


В Hive нет такой вещи, как динамически секционированная таблица. Таблица может быть секционированной или не секционированной. Режим динамического раздела - это способ загрузки данных во время INSERT - можно указать один статический раздел или разделы могут быть загружены динамически из выбора.

Пример загрузки динамических перегородок:

Insert overwrite table tabName partition(dt) --partition is not specified 
select sno,city,address,dt from tabStg where...; --will be loaded dynamically

Пример статической нагрузки на перегородку:

Insert overwrite table tabName partition(dt='2021-03-01') --static partition specified
select sno,city,address from tabStg where dt='2021-03-01'; --take care about correct data loaded

В последнем указанном статическом разделе запроса: partition(dt='2021-03-01'), обратите внимание, что в этом случае столбец раздела не присутствует в select. Вы можете загрузить другие даты в тот же раздел, если не фильтруете в WHERE.

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

Если в папке таблицы появилась новая папка раздела, ничего не происходит автоматически, вам нужно создать раздел в таблице tabStg, если это еще не было сделано с помощью MSCK REPAIR или ALTER TABLE, затем повторите загрузку во вторую таблицу tabName, используя статическую или динамическую загрузку.

В дополнение к этому, Hive может управлять разделами автоматически: добавлять раздел, если новая папка раздела была загружена в папку таблицы в файловой системе третьими средствами. Подробнее: Управление разделы автоматически - если эта функция работает в вашем Hive, вы можете обойтись без добавления разделов вручную (таблица REPAIR или ATER не требуется, если у вас есть эта функция) в исходной таблице. Но в любом случае загрузка данных во вторую таблицу должна производиться как раньше.

person leftjoin    schedule 20.03.2021