2011-09-25 16 views
16

Używam gałąź 071, przetwarza istniejące dane, które posiada następującą strukturę katalogów:
-TableName
- d = (np 2011-08-01)
- d = 2011-08-02
- d = 2011-08-03

... itd.
pod każdą datą mam pliki z datą.
teraz załadować dane używamHive: dynamiczne dodawanie do tabeli partycji zewnętrznego

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

Chciałbym mój skrypt ula, aby móc załadować odpowiednie partycje według niektórych daty wejścia oraz liczbę dni. więc jeśli mijam date = '2011-08-03' i dni = '7'
Skrypt powinien załadować następujących partycje - 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

Nie znalazłem żadnego sposobu na złagodzenie tego CEPT explicitlly trwania:

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

a następnie uruchomić mój kwerendy

select count(1) from table_name; 

jednak nie jest to offcourse zautomatyzowany według daty i dni wejścia

Czy jest jakiś sposób mogę zdefiniować do zewnętrznego tabela, aby załadować partycje zgodnie z zakresem dat lub arytmetyką dat?

+0

Cześć! Czy udało Ci się rozwiązać ten problem? Jeśli tak, czy możesz udostępnić swoje rozwiązanie? Dzięki!! – eli

+0

Podczas pracy z Amazon EMR. wskazuje, że Amazon zaimplementował następującą komendę: "alter table X recover partitions", która dodaje wszystkie podkatalogi jako partycje. to częściowo rozwiązuje problem za pomocą "gdzie d> start i d Tomer

+0

Dzięki. Miałem nadzieję, że nie będę musiał odzyskiwać partycji, ponieważ zajmuje to trochę czasu. – eli

Odpowiedz

0

Partycje to fizyczne segmentowanie danych - gdzie partycja jest utrzymywana przez system katalogów, a zapytania wykorzystują metadane do określenia lokalizacji partycji. więc jeśli chcesz, aby struktura katalogów była zgodna z zapytaniem, powinna znaleźć żądane dane. na przykład:

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

ale nie znam żadnej operacji data zasięgu inaczej, będziesz musiał zrobić matematyki najpierw do stworzenia wzorca zapytania.

Można również tworzyć tabele zewnętrzne i dodawać do nich partycje definiujące lokalizację. Umożliwia to niszczenie danych według potrzeb i nadal używa schematu partycji do optymalizacji zapytań.

-1

wyjaśniłem podobny scenariusz w moim blogu:

1) Należy ustawić właściwości:

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

2) Tworzenie zewnętrznego tabeli tymczasowej do ładowania danych wejściowych plików na tym komputerze stół.

3) Utwórz główną zewnętrzną tabelę produkcji "production_order" z polem daty jako jedną z kolumn podzielonych na partycje.

4) Załaduj tabelę produkcyjną z tabeli pomostowej, aby dane były automatycznie dystrybuowane w partycjach.

Wyjaśniono podobne pojęcie w poniższym wpisie na blogu. Jeśli chcesz zobaczyć kod.

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

+0

To może być najgorsza implementacja przy użyciu przemieszczania dla przypadku użycia produkcyjnego. Są tam dla jakiegoś celu. Nie zepsuj infras –

0

nie wierzę, nie ma żadnych wbudowanych funkcji do tego w ula. Możesz być w stanie napisać wtyczkę. Creating custom UDFs

Prawdopodobnie nie trzeba o tym wspominać, ale czy rozważałeś prosty skrypt bash, który zabrałby twoje parametry i przekazał komendy do ula?

Oozie workflows to kolejna opcja, jednak może to być przesada. Oozie Hive Extension - Po pewnym myśleniu nie sądzę, aby Oozie nad tym pracował.

6

Mam bardzo podobny problem, gdy po migracji muszę odtworzyć tabelę, dla której mam dane, ale nie metadane. Rozwiązaniem wydaje się po odtworzeniu tabeli:

TABELA NAPRAWY MSCK nazwa_tabeli;

Explained here

ten wspomina także "alter table X recover partitions" że PO skomentował na własnym stanowisku. MSCK REPAIR TABLE table_name; działa na implementacjach innych niż Amazon-EMR (Cloudera w moim przypadku).

+0

Dziękuję za wgląd. :) –

Powiązane problemy