2014-06-13 11 views
8

Mam dane w jednej tabeli Hive i chciałbym załadować dane do innej tabeli ula.Ładowanie danych z jednej tabeli Hive do drugiej z partycją

Tabela źródłowa to reg_logs, która ma 2 partycje, datę i godzinę. Dane są ładowane do tej tabeli co godzinę. Schemat jest:

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

docelowy tabela reg_logs_org chciałbym zrobić to skopiować wszystkie dane z reg_logs obok utc_hour kolumnie.

Schema stworzyłem to: (proszę poprawić jeśli się mylę)

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

dane wstawić do reg_logs_org z reg_logs: wiadomość

insert overwrite table reg_logs_org 
select id, region_code, sum(count), utc_date 
from 
reg_logs 
group by 
utc_date, id, region_code 

błędzie:

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 

Odpowiedz

16

to dlatego, że brakuje informacji partycji w zapytaniu insert

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 
3

w niektórych przypadkach może być konieczne ustawić hive.exec.dynamic.partition.mode = nonstrict aby móc wstawianie danych do tabeli podzielono na przykład

CREATE TABLE hivePartitionedTable 
(
      c1 int 
     , c2 int 
     , c3 string 
) 
PARTITIONED BY (year int) 
ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY ',' 
STORED AS SEQUENCEFILE 
; 

czym wkładka ta działa:

set hive.exec.dynamic.partition.mode=nonstrict; 

INSERT INTO hivePartitionedTable PARTITION (year) 
VALUES (1,2,'3', 1999); 
8

Utwórz kopię tabeli

CREATE TABLE my_table_backup LIKE my_table; 

obsługi dynamicznego partycjonowania

SET hive.exec.dynamic.partition = true; 
SET hive.exec.dynamic.partition.mode = nonstrict; 
SET hive.mapred.mode = nonstrict; 

skopiować tabelę

INSERT OVERWRITE TABLE dim_data_products_cube_backup PARTITION (ds) 
SELECT * FROM dim_data_products_cube 
WHERE ds = ds; 

gdzie potrzebna jest klauzula, jeśli używasz trybu ścisłego.

0

Podczas wstawiania danych obowiązkowe jest używanie kolumny podzielonej na partycje jako ostatniej kolumny. Hive pobierze dane, które znajdują się w ostatniej kolumnie.

więc na podstawie tego zapytania wkładki powinna być: -

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 
Powiązane problemy