2015-01-20 3 views
0

하이브 열에 특정 파생 값을 삽입하고 왜 작동하지 않는지 궁금합니다. 내 코드는 아래와 같습니다.선택을 통해 하이브에 값 삽입

Insert into month as select month(datestamp) as month from gc_1; 

여기 열은 이미에 NULL 값으로 존재하고 gc_1 테이블의 이름입니다. 테이블이 있습니다 : 내가 , 날짜와 같은 기능을 사용하여 다른 컬럼에서 하이브에 열을 추가하기 위해 가능 여부 없습니다 확신 등 질문에서

답변

2

, 여기 당신이 달성하려고하는 생각입니다 이라는 이름의 datestamp이라는 열이 이미 있으며 month 함수의 매개 변수로 적합한 날짜 문자열을 포함하고있는 것으로 추정됩니다. 그런 다음 month이라는 gc_1이라는 새 열을 만들려고합니다. (그런 식으로 권장하지 않습니다. month은 기본 제공 함수의 이름이기도합니다.) 해당하는 모든 값의 달력 달을 채우십시오. datestamp 열.

내가 여기 제대로 당신의 의도를 해석 한 가정하면 대략가는 하나의 일반적인 방법입니다 : 당신이 gc_1을 드롭에 temp_table의 이름을 변경, temp_table의 내용이 올바른지 확인했으면

CREATE TABLE temp_table AS SELECT *, MONTH(datestamp) AS month FROM gc_1; 

gc_1. 당신이 충분한 저장 공간을 가지고 있는지 만들기에 대한 일시적 gc_1을 복제합니다 물론

DROP TABLE gc_1; 
ALTER TABLE temp_table RENAME TO gc_1; 

, 그래서 재치있는 경고가 적용됩니다.

ALTER TABLE gc_1 ADD COLUMNS (month INT); 
INSERT OVERWRITE TABLE gc_1 SELECT column1, column2, ..., MONTH(datestamp) FROM gc_1; 

이 직접 이렇게 두 번째 테이블이 생성되지 않고, 원래의 테이블을 덮어 : 대안으로서

는 중복 테이블을 저장 방지하는 방법이있다. (가)이 취소 할 수 없습니다 덮어 동안 아무것도 틀려서 경우

  • gc_1의 복사본을 만들지 않고, 그러나,이 옵션을 몇 가지 단점이있다.
  • gc_1의 모든 열을 쿼리에서 올바른 순서로 열거해야합니다. gc_1이 많은 필드가있는 넓은 테이블 인 경우이 작업은 빠르게 지루하고 오류가 발생하기 쉽습니다.
+0

감사합니다. rchang. 그리고 당신은 그것을 완벽하게 이해했습니다. 그러나 테이블 크기가 크고 temp_table을 생성 할 수있는 옵션이 없습니다. 그래서 나는 두 번째 패스가 나를 위해 일할 것이라고 믿는다. 내가 너를 알려주려고하자. – LonelySoul