繁体   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