2017-11-22 10 views
1

//Hive-1.2.1000.2.6.1.0-129 OVERWRITE test5 테이블을 여러 개 문서 (https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML)에 따라 INSERT OVERWRITE는 테이블이나 파티션의 기존 데이터를 덮어 씁니다. 그러나 INSERT OVERWRITE 쿼리가 실행 된 후에도 일부 오래된 데이터가 계속 나타납니다. 아래는 샘플 실행 및 출력입니다.Spark SQL (HiveContext를 통한 하이브 쿼리) 하이브 테이블에 여러 파티션이있는 경우 INSERT OVERWRITE가 기존 데이터를 덮어 쓰지 않습니다.

//Spark-2.1.1 불꽃-2.1.1

CREATE TABLE dbtest.test5 (emp_id INT) PARTITIONED BY (depart_id INT,depart_name STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' STORED AS TEXTFILE LOCATION 'externalpath'; 

INSERT INTO TABLE dbtest.test5 PARTITION (depart_id,depart_name) SELECT emp_id,depart_id,depart_name from dbtest.tempTableHive1; 

4  123  Dev 
5  123  Dev 
6  123  Test 
7  567  Test 

INSERT INTO TABLE dbtest.test5 PARTITION (depart_id,depart_name) SELECT emp_id,depart_id,depart_name from dbtest.tempTableHive2; 
4  123  Dev 
5  123  Dev 
1  123  Dev 
2  123  Dev 
6  123  Test 
3  123  Test 
7  567  Test 

INSERT OVERWRITE TABLE dbtest.test5 PARTITION (depart_id,depart_name) SELECT emp_id,depart_id,depart_name from dbtest.tempTableHive3; 

8  123  Dev 
9  123  Dev 
10  123  Dev 
6  123  Test 
3  123  Test 
7  567  Test 

에 HiveContext를 통해 실행했을 때 우리는 코드에 어떤 잘못이 있습니까 밖으로 같은 넣어지고 또는 아파치 하이브의 문제인가?

답변

0

INSERT OVERWRITE를 지정할 때 Hive가 파티션을 덮어 씁니다. cloudera quick start VM의 출력물은 아래를 참조하십시오. 계속 문제가 발생하는 경우

hive> SELECT * FROM tempTableHive1; 
OK 
4 123 Dev 
5 567 Test 
Time taken: 0.048 seconds, Fetched: 2 row(s) 
hive> INSERT INTO TABLE test5 PARTITION (depart_id,depart_name) SELECT emp_id,depart_id,depart_name from tempTableHive1; 

hive> SELECT * FROM test5; 
OK 
4 123 Dev 
5 567 Test 
Time taken: 0.065 seconds, Fetched: 2 row(s) 

hive> SELECT * FROM tempTableHive2; 
OK 
4 123 Dev 
6 123 Dev 
Time taken: 0.047 seconds, Fetched: 2 row(s) 

hive> INSERT INTO TABLE test5 PARTITION (depart_id,depart_name) 
    > SELECT emp_id,depart_id,depart_name from tempTableHive2; 

hive> SELECT * FROM test5; 
OK 
4 123 Dev 
4 123 Dev 
6 123 Dev 
5 567 Test 
Time taken: 0.057 seconds, Fetched: 4 row(s) 

hive> SELECT * FROM tempTableHive3; 
OK 
100 123 Dev 
101 123 Dev 

hive> INSERT OVERWRITE TABLE test5 PARTITION (depart_id,depart_name) 
    > SELECT emp_id,depart_id,depart_name from tempTableHive3; 

hive> SELECT * FROM test5; 
OK 
100 123 Dev 
101 123 Dev 
5 567 Test 
Time taken: 0.072 seconds, Fetched: 3 row(s) 

이를 디버깅하는 가장 좋은 방법은 HDFS 파일을 검사하는 것입니다. 부서 ID/부서 이름 조합 당 하나의 파일이 있어야합니다. Example/user/hive/warehouse/test5/depart_id = 123/depart_name = Dev. 텍스트 파일이므로 내용을보기 위해 빠른 "cat"을 할 수 있습니다. 어떻게 지내는지 알아 봅시다.