簡體   English   中英

在配置單元表中交換分區時出錯

[英]Error while exchanging partition in hive tables

我正在嘗試將增量數據與現有的配置單元表合並。

為了測試,我從基表創建了一個虛擬表,如下所示:

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")

exchange 語句報錯:

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")

顯示創建表 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')

任何人都可以讓我知道我在這里做的錯誤是什么以及我應該更改什么才能成功交換分區?

我對這個錯誤的stg.inc_labels_neo4jdata是表stg.inc_labels_neo4jdata沒有分區為base.dummy ,因此沒有要移動的分區。

來自Hive 文檔

此語句允許您將分區中的數據從一個表移動到另一個具有相同架構但尚未具有該分區的表。

您可以查看 Hive DDL Manual for EXCHANGE PARTITION

以及將此功能添加到 Hive 的JIRA 你可以閱讀:

這僅適用於具有相同字段架構和相同參數分區的情況。 如果他們不這樣做,該命令將引發異常。

您基本上需要在source_tabledestination_table上擁有完全相同的架構。

根據您上次的編輯,情況並非如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM