我尝试的 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
;