2011-09-25 28 views
16

Sono in esecuzione alveare 071, l'elaborazione di dati esistenti che è ha la seguente struttura delle directory:
-tableName
- d = (ad esempio 2011-08-01)
- d = 2011-08-02 - d = 2011-08-03

... ecc
sotto ogni data ho i file di data.
ora per caricare i dati che sto utilizzandoHive: partizione dinamica aggiungendo alla tabella esterna

CREATE EXTERNAL TABLE table_name (i int) 
PARTITIONED BY (date String) 
LOCATION '${hiveconf:basepath}/TableName';** 

vorrei il mio script alveare per essere in grado di caricare le partizioni rilevanti secondo alcuni la data di ingresso, e il numero di giorni. quindi se mi passa data = '2011-08-03' e giorni = '7'
Lo script deve caricare i seguenti partizioni - d = 2011-08-03
- d = 2011-08 -04
- d = 2011-08-05
- d = 2011-08-06
- d = 2011-08-07
- d = 2011-08-08
- d = 2011-08 -09

Non ho trovato alcun modo discusso per farlo ex CEPT explicitlly esecuzione:

ALTER TABLE table_name ADD PARTITION (d='2011-08-03'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-04'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-05'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-06'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-07'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-08'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-09'); 

e poi correre la mia domanda

select count(1) from table_name; 

tuttavia questo non è offcourse automatizzata in base alla data e giorni di ingresso

C'è un modo posso definire all'esterno tabella per caricare le partizioni in base all'intervallo di date o all'aritmetica della data?

+0

Ciao! Sei riuscito a risolvere questo problema? Se sì, puoi condividere la tua soluzione? Grazie!! – eli

+0

Mentre lavoro con Amazon EMR. Appare che Amazon abbia implementato il seguente comando: "alter table X recover partitions" che aggiunge tutte le sottodirectory come partizioni. questo in parte risolve il problema usando "dove d> start e d Tomer

+0

Grazie. Speravo di evitare di dover recuperare partizioni, poiché ci vuole un po 'di tempo. – eli

risposta

0

Le partizioni sono una segmentazione fisica dei dati, in cui la partizione viene gestita dal sistema di directory e le query utilizzano i metadati per determinare dove si trova la partizione. quindi se puoi fare in modo che la struttura della directory corrisponda alla query, dovrebbe trovare i dati che desideri. per esempio:

select count(*) from table_name where (d >= '2011-08-03) and (d <= '2011-08-09'); 

ma non so di eventuali operazioni di data-range in caso contrario, si dovrà fare i calcoli per creare il modello di query prima.

è anche possibile creare tabelle esterne e aggiungere partizioni che definiscono la posizione. Ciò ti consente di distruggere i dati a tuo piacimento e di utilizzare ancora lo schema di partizione per ottimizzare le query.

-1

ho spiegato lo scenario simile nel mio post sul blog:

1) è necessario impostare le proprietà:

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

2) Creare una tabella di gestione temporanea esterna per caricare i dati file di input per questo tavolo.

3) Creare una tabella di produzione principale esterna "production_order" con campo data come una delle colonne partizionate.

4) Caricare la tabella di produzione dalla tabella di staging in modo che i dati vengano distribuiti automaticamente nelle partizioni.

Ha spiegato il concetto simile nel seguente post del blog. Se vuoi vedere il codice.

http://exploredatascience.blogspot.in/2014/06/dynamic-partitioning-with-hive.html

+0

Questa può essere la peggiore implementazione utilizzando la gestione temporanea per caso di utilizzo di produzione. Sono lì per uno scopo. Non scherzare con gli infras –

0

Io non credo che ci sia alcuna funzionalità incorporata per questo nel Hive. Potresti essere in grado di scrivere un plugin. Creating custom UDFs

Probabilmente non è necessario menzionarlo, ma hai considerato un semplice script bash che avrebbe preso i tuoi parametri e inviato i comandi all'alveare?

I flussi di lavoro Oozie sarebbero un'altra opzione, tuttavia potrebbe essere eccessivo. Oozie Hive Extension - Dopo un po 'di riflessione, non penso che Oozie possa lavorare per questo.

6

Ho un problema molto simile in cui, dopo una migrazione, devo ricreare una tabella per la quale ho i dati, ma non i metadati. La soluzione sembra essere, dopo aver ricreato la tabella:

TABELLA RIPARAZIONI MSCK nome_tabella;

Explained here

Questa menziona anche il "alter table X recover partitions" che OP ha commentato sul suo palo. MSCK REPAIR TABLE table_name; funziona su implementazioni EMR non Amazon (Cloudera nel mio caso).

+0

Grazie per l'intuizione. :) –

Problemi correlati