Caricamento dell’hive nella tabella partizionata

Ho un file di registro in HDFS, i valori sono delimitati da una virgola. Per esempio:

2012-10-11 12:00,opened_browser,userid111,deviceid222

Ora voglio caricare questo file nella tabella Hive con colonne “timestamp”, “action” e partizionato da “userid”, “deviceid”. Come posso chiedere a Hive di prendere le ultime 2 colonne nel file di log come partizione per tabella? Tutti gli esempi, eg "hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');" richiede la definizione di partizioni nello script, ma voglio che le partizioni vengano impostate automaticamente dal file HDFS.

L’unica soluzione è quella di creare una tabella non partizionata intermedia con tutte le 4 colonne, popolarla dal file e quindi creare un INSERT into first_table PARTITION (userid,deviceid) select from intermediate_table timestamp,action,userid,deviceid; ma questo è un compito aggiuntivo e avremo 2 tabelle molto simili .. O dovremmo creare una tabella esterna come intermedia.

Ning Zhang ha un’ottima risposta sull’argomento su http://grokbase.com/t/hive/user/114frbfg0y/can-i-use-hive-dynamic-partition-while-loading-data-into-tables .

Il rapido contesto è questo:

  1. Carica i dati semplicemente copia i dati, non li legge e non riesce a capire cosa deve essere partizionato
  2. Suggerirei di caricare prima i dati in una tabella intermedia (o di usare una tabella esterna che punta a tutti i file) e quindi lasciare che l’inserimento dinamico della partizione si avvii per caricarlo in una tabella partizionata

Ho lavorato a questo stesso scenario, ma, invece, ciò che abbiamo fatto è creare file di dati HDFS separati per ogni partizione che devi caricare.

Dal momento che i nostri dati provengono da un lavoro MapReduce, abbiamo utilizzato MultipleOutputs nella nostra class Reducer per multiplexare i dati nel loro file di partizione corrispondente. In seguito, si tratta solo di build lo script usando la Partizione dal nome del file HDFS.

  1. Come accennato nella risposta di @Denny Lee, dobbiamo coinvolgere una tabella di staging (invites_stg) gestita o esterna e quindi INSERIRE dalla tabella di staging alla tabella partizionata (invita in questo caso).

  2. Assicurati di avere queste due proprietà impostate su:

     SET hive.exec.dynamic.partition=true; SET hive.exec.dynamic.partition.mode=nonstrict; 
  3. E infine inserire per invitare,

     INSERT OVERWRITE TABLE India PARTITION (STATE) SELECT COL's FROM invites_stg; 

Fai riferimento a questo link per assistenza: http://www.edupristine.com/blog/hive-partitions-example