Hive - обязательно ли иметь «=» для внешней таблицы, чтобы рассматривать ее как раздел

Я новичок в Hive и у меня есть следующий основной вопрос:

Я пытаюсь создать внешнюю таблицу в каталоге HDFS по адресу

    /projects/score/output/scores_2020-06-30.gzip

но он не рассматривает его как раздел.

Если разработчику нужно изменить имя каталога scores=yyyy-mm-dd вместо scores_yyyy-mm-dd.gzip, например, /projects/score/output/scores=2020-06-30, тогда только он будет считаться разделенным?

т. е. Обязательно ли иметь «=» для внешней таблицы, чтобы рассматривать ее как раздел

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

CREATE EXTERNAL TABLE IF NOT EXISTS XYZ (
...
)
PARTITIONED BY (scores STRING)
LOCATION '/projects/score/output/';

Заранее спасибо!


person ShaanGreat    schedule 08.07.2020    source источник


Ответы (1)


Вы можете определить раздел поверх любого места, даже вне каталога таблицы, используя ALTER TABLE ADD PARTITION. Раздел в HDFS — это каталог, обычно внутри таблицы, но не обязательно. Если он находится внутри каталога таблицы, вы можете использовать msck repair table для присоединения существующих подкаталогов внутри каталога таблицы в качестве разделов, он будет сканировать местоположение таблицы и добавлять метаданные разделов.

В вашем примере каталог раздела отсутствует, у вас есть только каталог таблицы с файлом внутри. Имя файла в данном случае не имеет значения.

Не обязательно иметь каталог разделов в формате ключ=значение, хотя msck repair table может не работать в вашем дистрибутиве Hive, вы все равно можете добавить разделы с помощью команды ALTER TABLE ADD PARTITION ... LOCATION поверх любого каталога.

Может зависит от вендора. Например, в Qubole ALTER TABLE RECOVER PARTITIONS (альтернатива EMR MSCK REPAIR TABLE) отлично работает с такими каталогами, как «2020-06-30».

По умолчанию при вставке данных с использованием динамического разделения создаются папки разделов в формате ключ = значение, но если вы создаете каталоги разделов с помощью некоторых других инструментов, «значение» в качестве имени папки раздела допустимо. Просто проверьте, работает MSCK REPAIR или нет в вашем случае. Если это не так, создайте каталоги key=value, если вам нужен MSCK REPAIR.

Имя файла (файлов) и количество файлов внутри папки раздела в этом контексте не имеют значения.

person leftjoin    schedule 08.07.2020
comment
Итак, вы хотите сказать, что сначала я могу создать таблицу без разделов, а затем изменить таблицу, например ALTER TABLE ADD XYZ PARTITION ('scores_2020-06-30.gzip') LOCATION /projects/score/output/; Я очень сомневаюсь, что это сработает. Но проверим и обновим. - person ShaanGreat; 09.07.2020
comment
@ShaanGreat Когда вы создаете секционированную таблицу поверх некоторого каталога, разделы не создаются автоматически. Вам нужно ALTER TABLE ADD PARTITION ... LOCATION ... или MSCK REPAIR TABLE, msck repair найдет все каталоги внутри таблицы и создаст разделы для этих каталогов. - person leftjoin; 09.07.2020