进入 Hive 表 - 非分区表到具有多个分区的分区表 - 无法插入目标表,因为列号/类型

Posted

技术标签:

【中文标题】进入 Hive 表 - 非分区表到具有多个分区的分区表 - 无法插入目标表,因为列号/类型【英文标题】:into Hive table - Non Partitioned table to Partitioned table having multiple partitions - Cannot insert into target table because column number/types 【发布时间】:2021-01-07 04:54:27 【问题描述】:

当我尝试插入分区表时,出现以下错误:

SemanticException [错误 10044]:第 1:23 行无法插入目标表,因为列号/类型不同:表 insclause-0 有 6 列,3 列已分区,我们不需要任何必须转储的过滤器/store 从非分区表到分区表。

我的桌子:

来源:

id name   salary dep
1  sai    1000   sales
2  syam   2000   hr
3  sundar 3000   bank

目标:

id name   salary dep
1  sai    1000   sales
2  syam   2000   hr
3  sundar 3000   bank

分区(名称字符串,dep字符串)

请告诉我如何从源复制到目标

尝试以下方式。

insert into target_partitioned_table partition(name,dep) select id from source_table;

【问题讨论】:

【参考方案1】:

您应该列出选择中的所有列,分区列应该是最后一个并且顺序相同。列的顺序很重要。

检查表 DDL。如果按 Name 和 Dep 分区,则分区列应该是最后一个:id, salary, name, dep。如果列的顺序与您的问题中的一样,则该表看起来不像由(名称,Dep)分区,或者文件或数据示例中的列顺序错误。按照 DESCRIBE 命令返回的顺序插入列。

查询应该以完全相同的顺序包含所有列。

对于静态分区加载,您不需要选择中的分区列,分区规范中的值是静态的:

insert into table target_partitioned_table partition(name='Some Name',dep='Sales')
select id, salary from source_table;

对于动态分区加载(分区取自数据集,应按相同顺序在选择中):

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

insert into table target_partitioned_table partition(name,dep)
select id, salary, name, dep from source_table;

【讨论】:

以上是关于进入 Hive 表 - 非分区表到具有多个分区的分区表 - 无法插入目标表,因为列号/类型的主要内容,如果未能解决你的问题,请参考以下文章

Hive:分区表表结构和数据复制

从非分区表创建分区 hive 表

HIVE:在分区表中映射联接

hive多个分区插入同一个表

Hive中的分桶

Hive数据仓库分桶表分区未显示分区的数据