Как разделить таблицу по всем значениям? - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть внешняя таблица, теперь я хочу добавить в нее разделы.У меня 224 уникальных идентификатора города, и я хочу просто написать alter table my_table add partition (cityid) location /path;, но Улей жалуется, говоря, что я ничего не предоставляю для значения идентификатора города, это должно быть, например, alter table my_table add partition (cityid=VALUE) location /path;, но я не хочу запускать alter table команды для каждого значения идентификатора города, как я могу сделать это для всех идентификаторов за один раз?

Вот как выглядит командная строка куста:

hive> alter table pavel.browserdata add partition (cityid) location '/user/maria_dev/data/cityidPartition';                                                                                                                                                                                                           

FAILED: Таблица ValidationFailureSemanticException не секционирована, но спецификация секции существует: {cityid = null}

1 Ответ

0 голосов
/ 27 декабря 2018

Разделение на физическом уровне - это местоположение (отдельное расположение для каждого значения, обычно выглядит как key=value) с файлами данных.Если у вас уже есть структура каталогов разделов с файлами, все, что вам нужно, это создать разделы в метастафе Hive, затем вы можете указать свою таблицу на корневой каталог с помощью ALTER TABLE SET LOCATION, а затем использовать команду MSCK REPAIR TABLE.Эквивалентная команда в версии Hive для Amazon Elastic MapReduce (EMR): ALTER TABLE table_name RECOVER PARTITIONS.Это добавит метаданные разделов Hive.См. Руководство здесь: RECOVER PARTITIONS

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

Создайте еще одну многораздельную таблицу и используйте insert overwrite для загрузки данных раздела, используя динамическую загрузку раздела:

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

insert overwrite table2 partition(cityid) 
select col1, ... colN,
       cityid    
  from table1; --partitions columns should be last in the select

Это довольно эффективный способ реорганизации данных.

Последля этого вы можете удалить исходную таблицу и переименовать вашу целевую таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...