2014-05-21 6 views
0

거의 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;' 

만이 새 테이블에 원본 테이블에서 몇 열을 복사 할 새 나라면에 이전 테이블에서 파티션을 삽입하기 위해 아래 쿼리를 사용하고 있습니다.

'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.' 

의견이 있으십니까?

답변

2

쿼리는 새 테이블의 열 수와 유형과 일치해야합니다. 27 개의 일반 열과 3 개의 파티션 열로 새 테이블을 만들었지 만 쿼리는 6 개의 열만 선택합니다.

실제로 6 개의 열에 대해서만 신경 쓰면 새 테이블을 수정하여 해당 열만 갖도록하십시오. 모든 열을 원한다면 select 문을 수정하여 모든 열을 선택하십시오.

"복구 파티션"문도 필요하지 않습니다. 동적 파티션이있는 테이블에 삽입하면 파일 시스템과 메타 스토어에 파티션이 생성됩니다.