Улей, показывающий несуществующие разделы

У меня есть таблица в улье, DDL которой выглядит следующим образом:

CREATE TABLE test(id string) PARTITIONED BY (data_updated string,batch_id string,country string,state string);

data_updated=NO/batch_id=102/country='1'/state='A';
data_updated=NO/batch_id=103/country='2'/state='B';
data_updated=NO/batch_id=104/country='3'/state='C';

Я хочу переместить данные из data_updated = NO в data_updated = YES. И я делаю это с помощью команд HDFS.

data_updated=YES/batch_id=102/country='1'/state='A'
data_updated=YES/batch_id=103/country='2'/state='B'
data_updated=YES/batch_id=104/country='3'/state='C'

Один из вариантов - написать DDL с несколькими переименованными разделами. Но DDL с изменением раздела требуют, чтобы все разделы были указаны до N-го уровня. N-уровень является динамическим и не может быть определен статически.

Я получаю batch_ids с помощью скрипта unix и перемещаю каталог вручную с помощью команды перемещения в HDFS.

Inside a loop:
hadoop fs -mv /table/directory/data_processed=NO/batch_id=$i /table/directory/data_processed=YES/

Проблема с перемещением с помощью команд HDFS заключается в том, что после восстановления таблицы в кусте несуществующие разделы все еще существуют в метаданных улья. Как удалить несуществующие разделы из метаданных улья. Какие-либо предложения?

Вывод выставочного раздела в улье.

show partitions test;

data_updated=NO/batch_id=102/country='1'/state='A'; # NON-EXISTING
data_updated=NO/batch_id=103/country='2'/state='B'; # NON-EXISTING
data_updated=NO/batch_id=104/country='3'/state='C'; # NON-EXISTING
data_updated=YES/batch_id=102/country='1'/state='A'
data_updated=YES/batch_id=103/country='2'/state='B'
data_updated=YES/batch_id=104/country='3'/state='C'

person Abhay Dandekar    schedule 30.07.2018    source источник


Ответы (2)


Насколько я понимаю, из Hive невозможно удалить разделы из-за отсутствия каталогов hdfs. Самый простой способ, который я вижу, - это сбросить базу разделов на таких условиях

alter table test drop if exists partition (data_updated='NO');
person hlagos    schedule 30.07.2018

Согласно этому ответ, msck repair table не удаляет метаданные из хранилища метаданных для разделов, удаленных вручную. Для этого вам нужно будет запустить alter table drop partition (...), чтобы обновить метаданные.

Поскольку ваши разделы генерируются динамически, я бы посоветовал вам написать сценарий для запуска alter table команд, а не запускать их вручную. Например:

for path in $(hive -e "show partitions test" | grep "data_updated=NO")
do
  part=$(echo $path | tr "/" " ")
  echo "alter table test drop partitions($(echo $part | tr " " ","));"
done > drop_partitions.hql
person moebius    schedule 30.07.2018