进入 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 表 - 非分区表到具有多个分区的分区表 - 无法插入目标表,因为列号/类型的主要内容,如果未能解决你的问题,请参考以下文章