我尝试的 Hive 插入有解决方法吗
Is there a workaround to my attempted Hive insert
我使用
将schema2.card_master的结构复制到schema1.card_master
hive> create table schema1.card_master like schema2.card_master;
行得通,而且它像原来一样在一个字段上进行了分区。这个新的 table 有数百个字段,因此不方便列出,但我希望使用连接过滤器从原始 table 填充所有字段。现在我想使用 JOIN:
填充它
hive> insert overwrite table schema1.card_master (select * from schema2.card_master ccm INNER JOIN schema1.accounts da on ccm.cm13 = da.cm13);
FAILED: SemanticException 1:23 Need to specify partition columns because the destination table is partitioned. Error encountered near token 'cmdl_card_master'
我检查了复制过来的分区,这是一个字段mkt_cd,可以取 2 个值,US 或 PR。
所以我试试
hive> insert overwrite table schema1.card_master PARTITION (mkt_cd='US') (select * from schema2.card_master ccm INNER JOIN schema1.accounts da on ccm.cm13 = da.cm13);
FAILED: SemanticException [Error 10044]: Line 1:23 Cannot insert into target table because column number/types are different ''US'': Table insclause-0 has 255 columns, but query has 257 columns.
hive>
这是怎么回事?是否可以加载我的数据而不必在 schema2.card_master 的 Select 语句中明确提及所有字段?
连接中每个 table 的 select *
selects 列。仅使用 select ccm.*
而不是 select *
到 ccm
table 中的 select 列。同时删除静态分区规范 ('US'),使用动态代替,因为 ccm.*
包含分区列,并且当您加载静态分区时,您不应该在 select.
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table schema1.card_master partition(mkt_cd) --dynamic partition
select ccm.* --use alias
from schema2.card_master ccm
INNER JOIN schema1.accounts da on ccm.cm13 = da.cm13
;
我使用
将schema2.card_master的结构复制到schema1.card_masterhive> create table schema1.card_master like schema2.card_master;
行得通,而且它像原来一样在一个字段上进行了分区。这个新的 table 有数百个字段,因此不方便列出,但我希望使用连接过滤器从原始 table 填充所有字段。现在我想使用 JOIN:
填充它hive> insert overwrite table schema1.card_master (select * from schema2.card_master ccm INNER JOIN schema1.accounts da on ccm.cm13 = da.cm13);
FAILED: SemanticException 1:23 Need to specify partition columns because the destination table is partitioned. Error encountered near token 'cmdl_card_master'
我检查了复制过来的分区,这是一个字段mkt_cd,可以取 2 个值,US 或 PR。
所以我试试
hive> insert overwrite table schema1.card_master PARTITION (mkt_cd='US') (select * from schema2.card_master ccm INNER JOIN schema1.accounts da on ccm.cm13 = da.cm13);
FAILED: SemanticException [Error 10044]: Line 1:23 Cannot insert into target table because column number/types are different ''US'': Table insclause-0 has 255 columns, but query has 257 columns.
hive>
这是怎么回事?是否可以加载我的数据而不必在 schema2.card_master 的 Select 语句中明确提及所有字段?
select *
selects 列。仅使用 select ccm.*
而不是 select *
到 ccm
table 中的 select 列。同时删除静态分区规范 ('US'),使用动态代替,因为 ccm.*
包含分区列,并且当您加载静态分区时,您不应该在 select.
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table schema1.card_master partition(mkt_cd) --dynamic partition
select ccm.* --use alias
from schema2.card_master ccm
INNER JOIN schema1.accounts da on ccm.cm13 = da.cm13
;