交换配置单元表中的分区时出错

时间:2019-07-05 15:56:08

标签: apache-spark hive

我正在尝试将增量数据与现有的配置单元表合并。

为了进行测试,我从基本表中创建了一个虚拟表,如下所示:

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分区,并且我已成功删除它。 我是从spark代码运行的,其配置如下所示:

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

任何人都可以让我知道我在这里犯了什么错误以及我应该更改什么才能成功交换分区吗?

1 个答案:

答案 0 :(得分:1)

我对这个错误的看法是,表stg.inc_labels_neo4jdata未分区为base.dummy,因此没有要移动的分区。

来自Hive documentation

  

此语句使您可以将分区中的数据从表移动到   具有相同架构且尚未具有该架构的另一个表   分区。

您可以查看Hive DDL手册中的EXCHANGE PARTITION

此功能被添加到Hive的JIRA。您可以阅读:

  

仅当且具有   相同的字段模式和相同的参数分区。如果他们不这样做   该命令将引发异常。

基本上,source_tabledestination_table上都必须具有完全相同的架构。

不是您的上一次编辑。