2017-02-09 7 views
1

하이브에서 같은 파티션 테이블을 선택하여 열 값을 덮어 쓰는 방법.하이브의 파티션 테이블에서 다른 열을 선택하여 열 값을 덮어 쓰는 방법

I 쿼리

CREATE TABLE user (fname string,lname string) partitioned By (day int); 

아래 실행하여 테이블을 생성하고 난 테이블에 데이터를 삽입 한 후에 데이터를 삽입한다. 나는 다음과 같은 선택 쿼리 실행 : 내가 추가 쿼리 아래의 도움으로,

AA AA 20170201 
BB BB 20170201 
CC CC 20170201 
DD DD 20170202 
EE EE 20170203 

내 요구 사항에 따라, 내 테이블에 하나 더 열을 추가 할

(사용자).
ALTER TABLE user ADD COLUMNS (day2 int); 

열을 추가 한 후, 내 표는 내가 같은 테이블을 원하는
AA AA NULL 20170201 
BB BB NULL 20170201 
CC CC NULL 20170201 
DD DD NULL 20170202 
EE EE NULL 20170203 

이하 그러나처럼 보인다.

AA AA 20170201 20170202 
BB BB 20170201 20170202 
CC CC 20170201 20170202 
DD DD 20170202 20170202 
EE EE 20170203 20170203 

그래서 나는

insert overwrite table user partition (day) 
select 
    fname, 
    lname, 
    day as day2, 
    case 
     when day <= 20170202 then 20170202 
     when day > 20170202 then day 
    end as day 
from user; 

나는 실행 한 선택 쿼리 결과는

select * from user; 

아래처럼 쿼리 아래 실행 :

AA AA NULL 20170201 
BB BB NULL 20170201 
CC CC NULL 20170201 
AA AA NULL 20170202 
BB BB NULL 20170202 
CC CC NULL 20170202 
DD DD NULL 20170202 
EE EE NULL 20170203 

왜 내가 널 (null) 값을 얻고있다 . 제발 날 시켜줘. 오래된 파티션 스키마 업데이트를받지 못했을 수 있습니다 level.So 나는 놓쳤다 아는, 분할 하이브 테이블의 동작에 따라 this.i.e

AA AA 20170201 20170202 
    BB BB 20170201 20170202 
    CC CC 20170201 20170202 
    DD DD 20170202 20170202 
    EE EE 20170203 20170203 

답변

0

을 달성하는 방법을 보자, 하이브의 스키마 정의는 파티션을 유지하고 있습니다.

이 시점에서 자세한 쿼리

hive> drop table test_insert; 
OK 
hive> CREATE TABLE test_insert (fname string,lname string) partitioned By (day int); 
OK 
hive> insert into test_insert partition (day=20170202) values('f','l'); 
OK 
hive> insert into test_insert partition (day=20170203) values('f','l'); 
OK 
hive> select * from test_insert; 
OK 
f l 20170202 
f l 20170203 
Time taken: 0.148 seconds, Fetched: 2 row(s) 
hive> ALTER TABLE test_insert ADD COLUMNS (day2 int); 
OK 
Time taken: 0.193 seconds 
hive> select * from test_insert; 
OK 
    f l NULL 20170202 
    f l NULL 20170203 

, 분할 된 테이블에 대한 스키마 파티션 레벨로 유지되며,이 파티션 스키마가 아닌 테이블 스키마를 존중 예정되어 있다는 점을 알 수 있습니다.

여기에서 항목의 차이점을 확인하십시오. ALTER는 기존 파티션의 열 정의를 변경하지 않았습니다.

hive> describe formatted test_insert; 
    OK 
    # col_name    data_type    comment    

    fname     string          
    lname     string          
    day2     int           

    # Partition Information  
    # col_name    data_type    comment    

    day      int  

    hive> describe formatted test_insert partition (day=20170202); 
    OK 
    # col_name    data_type    comment    

    fname     string          
    lname     string          

    # Partition Information  
    # col_name    data_type    comment    

    day      int       

위의 쿼리를 수정하여 스키마를 새로 만든 파티션으로 복사 할 수 있도록 새 파티션을 만들었습니다.

hive> insert overwrite table test_insert partition (day) 
     > select 
     >  fname, 
     >  lname, 
     >  day as day2, 
     >  case 
     >   when day <= 20170202 then 19999999 
     >   when day > 20170202 then day 
     >  end as day 
     > from test_insert; 


    hive> select * from test_insert; 
    OK 
    f l 20170202 19999999 
    f l NULL 20170202 
    f l NULL 20170203 
    Time taken: 0.224 seconds, Fetched: 3 row(s) 

희망 사항입니다. 기존의 모든 파티션에 대한 스키마를 변경하려면 다음 명령을 시도한 다음 삽입을 시도하십시오.

ALTER TABLE test_insert partition(day) ADD COLUMNS (day2 string);