Добавление нового раздела во внешнюю таблицу Hive с помощью блоков данных

У меня есть папка, в которой раньше были подпапки, основанные на 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 Query - (на 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`.;

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

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


person Golokesh Patra    schedule 13.07.2020    source источник


Ответы (3)


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

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

Просто измените «ИСПОЛЬЗОВАНИЕ ПАРКЕТА» на «ИСПОЛЬЗОВАНИЕ ДЕЛЬТА» в вашем DDL.

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

person Douglas M    schedule 02.08.2020
comment
Спасибо @Douglas, я также использую таблицы Databricks Delta Lake. Но здесь я намерен обрабатывать и поддерживать старые исторические данные и приложения (например, 3-4 года назад), которые не были загружены в соответствии с довольно новой дельтой блоков данных. Но ваш комментарий дал мне лучшее представление, постараюсь сообщить вам. - person Golokesh Patra; 03.08.2020
comment
@GolokeshPatra Хорошо, понял. Я неправильно прочитал предыдущий вопрос и ваш ответ. Какова цель добавления названия компании? Это для облегчения выполнения запросов или защиты данных? Я обнаружил, что разделы в мета-хранилище могут снизить производительность чтения. Таблицы Delta Lake в них не нуждаются (в хранилище метаданных). - person Douglas M; 03.08.2020

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

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

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

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

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

person leftjoin    schedule 13.07.2020
comment
Спасибо @leftjoin, но если вы внимательно посмотрите, моя структура папок / каталогов неоднородна. Среди всех папок ingestiontime = ... у меня есть несколько папок businessname / ingestiontime = .... Итак, я хочу добавить новые разделы в уже созданную таблицу кустов. Я не пытаюсь добавить новый столбец, я пытаюсь добавить новые разделы в уже существующую внешнюю таблицу улья, т.е. добавить новые таблицы businessname / ingestiontime = .. в ее метаданные. - person Golokesh Patra; 14.07.2020
comment
@GolokeshPatra, если вы не пытаетесь добавить новый столбец, то почему вы используете ДВА столбца в спецификации раздела: partition (businessname=007,ingestiontime=20200712230000)? Используйте такое же разбиение, как определено в таблице DDL, и добавьте ЛЮБОЙ каталог в качестве раздела - person leftjoin; 14.07.2020

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

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

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

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

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

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>

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

person Golokesh Patra    schedule 31.07.2020