Как разбить таблицу по всем значениям?

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

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

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

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


person hey_you    schedule 27.12.2018    source источник
comment
я не думаю, что это возможно. либо вам нужно создать сценарий оболочки, либо новую таблицу   -  person Gaurang Shah    schedule 27.12.2018
comment
@GaurangShah, хорошо, ты можешь мне сказать, как?   -  person hey_you    schedule 27.12.2018


Ответы (1)


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

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

Создайте еще одну многораздельную таблицу и используйте 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

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

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

person leftjoin    schedule 27.12.2018
comment
Я видел это раньше. И я получаю ошибки для insert overwrite. Оказалось, что в моем курсе по большим данным 201 они что-то напутали, и вместо работы с набором данных 1 ГБ я работал с набором данных 24 ГБ, из-за этого у меня не хватало памяти, и после того, как я добавил новые диски в hdfs я начал получать странные ошибки (у hortonworks нет документации о том, как правильно добавлять диски на свою платформу). Я попробую это сделать с меньшим набором данных и дам вам знать, сработало ли это. - person hey_you; 28.12.2018
comment
Не могли бы вы взглянуть сюда? stackoverflow.com/questions/53959342 / - person hey_you; 28.12.2018