Невозможно выполнить раздел обмена кустами из-за сбоя: Раздел уже существует - PullRequest
2 голосов
/ 29 июня 2019

Я пытаюсь обменять раздел из промежуточной базы данных после объединения инкрементных данных с существующим, как показано ниже:

  1. Создана промежуточная таблица с разделом:

    CREATE TABLE stg.customers_testcontrol_staging(customer_id bigint,customer_name string, customer_number string,status string,attribute_category string,attribute1 string, attribute2 string, attribute3 string, attribute4 string, attribute5 string) PARTITIONED BY (source_name string) ROW FORMAT SERDE'org.apache.hadoop.hive.ql.io.orc.OrcSerde' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' Location('/apps/hive/warehouse/stg.db/customers_testcontrol_staging'

  2. Вставленные данные в вышеприведенную таблицу после объединения с данными базовой таблицы

    INSERT OVERWRITE TABLE finstg.customers_testcontrol_staging PARTITION (source_name) SELECT t1.* FROM (SELECT * FROM base.customers where source_name='ORACLE' UNION ALL SELECT * FROM external.customers_incremental_data) t1 JOIN (SELECT customer_id,source_name, max(updated_date) max_modified FROM (SELECT * FROM base.customers where source_name='ORACLE' UNION ALL SELECT * FROM external.customers_incremental_data) t2 GROUP BY customer_id,source_name) s ON t1.customer_id=s.customer_id AND t1.source_name=s.source_name;

Первичные ключитаблица, в которой я выполняю соединение: customer_id & source_name

Шаг раздела Exchange:

ALTER TABLE base.customers EXCHANGE PARTITION (source_name = 'ORACLE') WITH TABLE stg.customers_testcontrol_staging;

Но шаг раздела обмена завершается ошибкой, за исключением:

Ошибка: ошибка при компиляции оператора: СБОЙ: SemanticException [Ошибка 10118]: Раздел уже существует [клиенты (имя_источника = ORACLE)]

Я взял синтаксис из HiveСтраница слияния

Что я пропустил, чтобы включить в оператор раздела EXCHANGE?Может ли кто-нибудь сказать мне, что я здесь делаю, и как я могу это исправить?

1 Ответ

1 голос
/ 29 июня 2019

Чтобы успешно выполнить exchange partition, ваша таблица назначения base.customers не может содержать раздел, которым вы обмениваетесь.

  • Но у таблицы base.customers уже есть раздел (имя_источника = ORACLE) , которым вы обмениваетесь.

Resolution:

  • Удалите существующую partition из таблицы назначения и снова введите команду раздела exchange.

(или)

  • Обмен раздела, который еще не существует в месте назначения таблица.

  • Если вы хотите просто добавить данные в таблицу Destination, затем запустите вставку в таблицу base.customers, выбрав из stg.customers_testcontrol_staging таблица.

From HiveDocs: Constraints for Hive Exchange partitions:

  1. Таблица назначения не может содержать раздел для обмена.

  2. Операция завершается неудачно при наличии индекса.

  3. Разделение Exchange также запрещено с транзакционными таблицами в качестве источника или назначения. Или используйте LOAD DATA или INSERT. Команды OVERWRITE для перемещения разделов по транзакционным таблицам.

  4. Эта команда требует, чтобы имена исходной и целевой таблиц иметь ту же схему таблицы. Если схемы разные, то следующее исключение:

  5. Таблицы имеют разные схемы. Их разделы не могут быть обменены

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