Добавление нового раздела во внешнюю таблицу Hive с помощью блоков данных - PullRequest
2 голосов
/ 13 июля 2020

У меня есть папка, в которой ранее были подпапки на основе ingestiontime, который также является исходным PARTITION, используемым в его таблице Hive.

Таким образом, папка выглядит как -

s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200712230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200711230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200710230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200709230000/....
........

Внутри каждой папки времени приема данные представлены в формате PARQUET.

Теперь в той же папке myStreamingData я добавляю еще одну папку, которая содержит похожие данные, но в папке с именем businessname.

Итак, моя структура папок теперь выглядит так -

s3://MyDevBucket/dev/myStreamingData/businessname=007/ingestiontime=20200712230000/....
s3://MyDevBucket/dev/myStreamingData/businessname=007/ingestiontime=20200711230000/....
s3://MyDevBucket/dev/myStreamingData/businessname=007/ingestiontime=20200710230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200712230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200711230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200710230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200709230000/....
    ........

Так что мне нужно добавить данные из раздела businessname в мою текущую таблицу улья.

Для этого я выполнялся запрос ALTER - (на Databricks)

%sql
alter table gp_hive_table add partition (businessname=007,ingestiontime=20200712230000) location "s3://MyDevBucket/dev/myStreamingData/businessname=007/ingestiontime=20200712230000"

Но я получаю эту ошибку -

Error in SQL statement: AnalysisException: businessname is not a valid partition column in table `default`.`gp_hive_table`.;

Какую часть я делаю здесь неправильно?

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

Ответы [ 3 ]

2 голосов
/ 02 августа 2020

Поскольку вы уже используете Databricks, и это вариант использования потоковой передачи, вам определенно следует серьезно взглянуть на использование таблиц Delta Lake.

Вам не придется связываться с явным ... ADD Операторы PARTITION и MSCK. Delta Lake со свойствами ACID гарантирует, что ваши данные будут зафиксированы должным образом, если ваша работа не удастся, вы не получите частичных результатов. Как только данные зафиксированы, они становятся доступными для пользователей (опять же без операторов MSCK и ADD PARTITION).

Просто измените «USING PARQUET» на «USING DELTA» в вашем DDL.

Вы также можете (ПРЕОБРАЗОВАТЬ) существующую паркетную таблицу в таблицу Delta Lake, а затем начать использовать INSERT, UPDATE, DELETE, MERGE INTO, COPY INTO из пакетных и структурированных потоковых заданий Spark. OPTIMIZE устранит проблему с небольшим файлом.

1 голос
/ 13 июля 2020

alter table gp_hive_table add partition - это добавить раздел (местоположение данных, а не новый столбец) в таблицу с уже определенной схемой разделения, это не меняет текущую схему разделения, а просто добавляет метаданные раздела, что в некотором месте есть раздел, соответствующий какое-то значение столбца разделения.

Если вы хотите изменить столбцы раздела, вам необходимо воссоздать таблицу.:

  1. Удалите (проверьте, ВНЕШНИЙ) таблицу: DROP TABLE gp_hive_table;

  2. Создать таблицу с новым столбцом разделения. Разделы НЕ БУДУТ создаваться автоматически.

  3. Теперь вы можете добавлять разделы с помощью ALTER TABLE ADD PARTITION или использовать MSCK REPAIR TABLE для их автоматического создания на основе структуры каталогов. Перед выполнением этих команд структура каталогов должна соответствовать схеме разбиения

0 голосов
/ 31 июля 2020

Итак, основываясь на предложении @ leftjoin,

Вместо таблицы улья без businessname в качестве одного из разделов, я сделал -

Шаг 1 -> Создать таблицу кустов с помощью - PARTITION BY (businessname long,ingestiontime long)

Шаг 2 -> Выполнен запрос - MSCK REPAIR <Hive_Table_name> для автоматического добавления разделов.

Шаг 3 -> Теперь есть папки времени приема, которых нет в папке businessname, т.е. такие папки, как -

s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200712230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200711230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200710230000/....
s3://MyDevBucket/dev/myStreamingData/ingestiontime=20200709230000/....

Я написал небольшой фрагмент кода для получения всех таких разделов, а затем запустил следующий запрос для всех из них - ALTER TABLE <hive_table_name> ADD PARTITION (businessname=<some_value>,ingestiontime=<ingestion_time_partition_name>) LOCATION "<s3_location_of_all_partitions_not_belonging_to_a_specific_businesskey>

Это решило мою проблему.

...