我有一个几乎有500个分区的外部分区表。我试图创建另一个与旧表具有相同属性的外部表。然后我想复制所有分区从我的旧表到新创建的表。下面是我的创建表查询。我的旧表存储为TEXTFILE,我想保存一个新的ORC文件。
'add jar json_jarfile;
CREATE EXTERNAL TABLE new_table_orc (col1,col2,col3...col27)
PARTITIONED BY (year string, month string, day string)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (....)
STORED AS orc
LOCATION 'path';'
在创建这个表之后。我使用下面的查询将分区从旧表插入到新表。我只想从原表复制几列到新表
'set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
INSERT OVERWRITE TABLE new_table_orc PARTITION (year,month,day) SELECT col2,col3,col6,year,month,day FROM old_table;
ALTER TABLE new_table_orc RECOVER PARTITIONS;'
i ' m getting below error.
'FAILED: SemanticException [Error 10044]: Line 2:23 Cannot insert into target table because column number/types are different 'day': Table insclause-0 has 27 columns, but query has 6 columns.'
有什么建议吗?
查询必须匹配新表中列的数量和类型。您已经创建了包含27个常规列和3个分区列的新表,但是您的查询只选择了6个列。
如果您真的只关心这六列,那么修改新表使其只包含这些列。如果需要所有列,则修改select语句以选择所有列。
您也不需要"恢复分区"语句。当您用动态分区插入表时,它将在文件系统和metastore中创建这些分区。