hadoop - 컴투스 - hive란
파티션이있는 하나의 하이브 테이블에서 다른 하이브 테이블로 데이터로드 (3)
하나의 하이브 테이블에 데이터가 있고 또 다른 하이브 테이블에 데이터를로드하고 싶습니다.
원본 테이블은 2 개의 파티션, 날짜 및 시간이있는 reg_logs입니다. 데이터는 시간별로이 테이블에로드됩니다. 스키마는 다음과 같습니다.
CREATE EXTERNAL TABLE IF NOT EXISTS reg_logs (
id int,
region_code int,
count int
)
PARTITIONED BY (utc_date STRING, utc_hour STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION '/ad_data/raw/reg_logs';
대상 테이블은 reg_logs_org입니다. 내가하고 싶은 것은 utc_hour 컬럼 옆의 reg_logs에서 모든 데이터를 복사하는 것입니다.
내가 만든 스키마는 다음과 같습니다 (잘못된 경우 수정하십시오).
CREATE EXTERNAL TABLE IF NOT EXISTS reg_logs_org (
id int,
region_code int,
count int
)
PARTITIONED BY (utc_date STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION '/ad_data/reg_logs_org';
reg_logs에서 reg_logs_org로 데이터를 삽입하십시오.
insert overwrite table reg_logs_org
select id, region_code, sum(count), utc_date
from
reg_logs
group by
utc_date, id, region_code
에러 메시지:
FAILED: SemanticException 1:23 Need to specify partition columns because the destination table is partitioned. Error encountered near token 'reg_logs_org'
==
Thank you,
Rio
삽입 쿼리에서 파티션 정보가 누락 되었기 때문입니다.
insert overwrite table reg_logs_org PARTITION (utc_date)
select id, region_code, sum(count), utc_date
from
reg_logs
group by
utc_date, id, region_code
어떤 경우에는 파티션 된 테이블에 데이터를 삽입 할 수 있도록 hive.exec.dynamic.partition.mode = nonstrict를 설정해야 할 수도 있습니다 (예 :
CREATE TABLE hivePartitionedTable
(
c1 int
, c2 int
, c3 string
)
PARTITIONED BY (year int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS SEQUENCEFILE
;
이 INSERT가 작동합니다 :
set hive.exec.dynamic.partition.mode=nonstrict;
INSERT INTO hivePartitionedTable PARTITION (year)
VALUES (1,2,'3', 1999);
데이터를 삽입하는 동안 마지막 열로 분할 된 열을 사용하는 것이 필수입니다. Hive는 마지막 열에있는 데이터를 가져옵니다.
그래서 그 삽입 쿼리를 기반으로해야합니다 :
insert overwrite table reg_logs_org PARTITION (utc_date)
select id, region_code, sum(count), utc_date
from
reg_logs
group by
utc_date, id, region_code
동적 파티션 열은 SELECT 문의 열 중 마지막으로 PARTITION () 절에 나타나는 것과 같은 순서로 지정 해야합니다