2012-01-27 10 views
12

Chcę utworzyć tabelę Hive, w której wejściowe pliki tekstowe są wykonywane na wielu podkatalogach w formacie hdf. Więc przykład mam w HDFS:Hive: Tworzenie tabeli z wieloma plikami z wieloma katalogami

/testdata/user/Jan/part-0001 
    /testdata/user/Feb/part-0001 
    /testdata/user/Mar/part-0001 
and so on... 

jeśli chcę utworzyć użytkownika tabeli w ulu, ale mają być w stanie przemierzać podkatalogów z obsługą, może to zrobić? Próbowałem czegoś takiego, ale nie działa;

CREATE EXTERNAL TABLE users (id int, name string) 
STORED AS TEXTFILE LOCATION '/testdata/user/*' 

Myślałem, że dodanie symbolu wieloznacznego będzie działało, ale nie działa. Kiedy próbowałem nie używać wildcard nadal nie działa. Jeśli jednak skopiuję pliki do katalogu głównego użytkownika, to działa. Czy nie ma sposobu, by Hive przemieściło się do katalogów-dzieci i złapało te pliki?

Odpowiedz

5

Hive wykorzystuje podkatalogi jak partycje z danymi, więc po prostu:

CREATE EXTERNAL TABLE users (id int, name string) PARTITIONED BY (month string) 
STORED AS TEXTFILE LOCATION '/testdata/user/' 

To powinno zrobić to za Ciebie.

+0

To nie zadziałało. Właściwie powinienem był wspomnieć, że mam teraz CDH3u1. – user706794

+2

Definiuj "Nie działa". Powinienem też wspomnieć o konieczności zmiany nazw katalogów na month = Jan etc ... –

0
CREATE EXTERNAL TABLE user (id int, name string); 
LOAD DATA INPATH "/testdata/user/*/*" INTO TABLE users; 
+0

To nie zadziałało. Właściwie powinienem już wspomnieć na CDH3u1. – user706794

+0

nie działa dla mnie w CDH5.7 – voldy

17

Można utworzyć tabelę zewnętrzną, a następnie dodać podfoldery jako partycje.

CREATE EXTERNAL TABLE test (id BIGINT) PARTITIONED BY (yymmdd STRING); 
ALTER TABLE test ADD PARTITION (yymmdd = '20120921') LOCATION 'loc1'; 
ALTER TABLE test ADD PARTITION (yymmdd = '20120922') LOCATION 'loc2'; 
+0

To jest niesamowita odpowiedź! Tak, masz kłopot z aktualizacją tabeli za każdym razem, gdy pojawi się nowy katalog danych (raz dziennie w moim przypadku). Ale działa bez zarzutu. –

+0

To także jedna z fajnych rzeczy o tym, jak Hive przechowuje dane. Przy przechowywaniu danych w ten sposób i reprezentowanych jako partycje dane partycji stają się wirtualną kolumną. Oznacza to, że gdy kwerendujesz w sposób, który ogranicza wyniki do podzbioru dat (w tym przypadku), Hive musi tylko wyszukiwać w kilku miejscach, zamiast skanować cały zestaw danych w celu uzyskania odpowiedzi. – agentv

+0

To powinno być wybrane jako zaakceptowana odpowiedź - idealnie odpowiada na pytanie. Pomogłeś mi także, więc dziękuję za odpowiedź! –

5

Skończyło się na używaniu skryptu powłoki jak poniżej dla przypadku użycia, gdzie podkatalogi nie są znane a priori.

#!/bin/bash 
hive -e "CREATE EXTERNAL TABLE users (id int, name string) PARTITIONED BY (month string) STORED AS TEXTFILE LOCATION '/testdata/user/'; " 

hscript="" 

for part in `hadoop fs -ls /testdata/user/ | grep -v -P "^Found"|grep -o -P "[a-zA-Z]{3}$"`; 
do 

echo $part 
tmp="ALTER TABLE users ADD PARTITION(month='$part');" 
hscript=$hscript$tmp 
done; 

hive -e "$hscript" 
Powiązane problemy