Ошибка при обмене разделами в таблицах кустов - PullRequest
1 голос
/ 05 июля 2019

Я пытаюсь объединить инкрементные данные с существующей таблицей улья.

Для тестирования я создал фиктивную таблицу из базовой таблицы, как показано ниже:

create base.dummytable like base.fact_table

Таблица: base.fact_table это раздел на основе dbsource String Когда я проверил DDL фиктивной таблицы, я увидел, что столбец раздела определен правильно.

PARTITIONED BY (                                                 |
|   `dbsource` string)

Затем я попытался заменить один из разделов из фиктивной таблицы, отбросив его первым.

spark.sql("alter table base.dummy drop partition(dbsource='NEO4J')")

Раздел: NEO4J успешно удален, и я запустил оператор обмена, как показано ниже:

spark.sql("ALTER TABLE base.dummy EXCHANGE PARTITION (dbsource = 'NEO4J') WITH TABLE stg.inc_labels_neo4jdata")

Оператор обмена выдает ошибку:

Error: Error while compiling statement: FAILED: ValidationFailureSemanticException table is not partitioned but partition spec exists: {dbsource=NEO4J}

Таблица, которую я пытаюсь выдвинуть инкрементными данными, разделена на dbsource, и я успешно удалил ее. Я запускаю это из кода искры и конфиг приводится ниже:

  val conf = new SparkConf().setAppName("MERGER").set("spark.executor.heartbeatInterval", "120s")
      .set("spark.network.timeout", "12000s")
      .set("spark.sql.inMemoryColumnarStorage.compressed", "true")
      .set("spark.shuffle.compress", "true")
      .set("spark.shuffle.spill.compress", "true")
      .set("spark.sql.orc.filterPushdown", "true")
      .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
      .set("spark.kryoserializer.buffer.max", "512m")
      .set("spark.serializer", classOf[org.apache.spark.serializer.KryoSerializer].getName)
      .set("spark.streaming.stopGracefullyOnShutdown", "true")
      .set("spark.dynamicAllocation.enabled", "false")
      .set("spark.shuffle.service.enabled", "true")
      .set("spark.executor.instances", "4")
      .set("spark.executor.memory", "4g")
      .set("spark.executor.cores", "5")
      .set("hive.merge.sparkfiles","true")
      .set("hive.merge.mapfiles","true")
      .set("hive.merge.mapredfiles","true")

show create table base.dummy:

CREATE TABLE `base`.`dummy`(
`dff_id` bigint, 
`dff_context_id` bigint,  
`descriptive_flexfield_name` string,  
`model_table_name` string)
 PARTITIONED BY (`dbsource` 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/base.db/dummy'
 TBLPROPERTIES ( 
'orc.compress'='ZLIB')

показать создать таблицу stg.inc_labels_neo4jdata:

CREATE TABLE `stg`.`inc_labels_neo4jdata`(
`dff_id` bigint, 
`dff_context_id` bigint,  
`descriptive_flexfield_name` string,  
`model_table_name` string)
`dbsource` 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/inc_labels_neo4jdata'
 TBLPROPERTIES ( 
'orc.compress'='ZLIB')

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

1 Ответ

1 голос
/ 05 июля 2019

Я полагаю, что эта ошибка состоит в том, что таблица stg.inc_labels_neo4jdata не разбита на разделы как base.dummy и, следовательно, нет раздела для перемещения.

С Документация на улей :

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

Вы можете проверить Руководство по Hive DDL для ОБМЕН РАЗДЕЛОМ

И JIRA , где эта функция была добавлена ​​в Hive. Вы можете прочитать:

Это работает только тогда, когда есть одинаковые схемы полей и одинаковое разбиение по параметрам. Если они не команда сгенерирует исключение.

В принципе вам нужно иметь одинаковую схему для source_table и destination_table.

Согласно вашему последнему редактированию, это не так.

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