11

ROZWIĄZANA: Zobacz "Zaktualizuj nr 2 poniżej" dla "rozwiązania" tego problemu.Ładowanie danych przez linie Hive, S3, EMR i odzyskiwanie partycji

~~~~~~~

W s3, mam dziennik plików * .GZ przechowywane w zagnieżdżonej strukturze katalogów jak:

s3://($BUCKET)/y=2012/m=11/d=09/H=10/ 

Ja próbuje załadować je do ula na Elastic Map Reduce (EMR), z użyciem spec partycji wielopoziomowego jak:

create external table logs (content string) 
partitioned by (y string, m string, d string, h string) 
location 's3://($BUCKET)'; 

stworzenie prac tabeli. I wtedy próbować odzyskać wszystkich istniejących partycji:

alter table logs recover partitions; 

To wydaje się działać i to nie drążyć przez moją struktury S3 i dodać wszystkie różne poziomy katalogach:

hive> show partitions logs; 
OK 
y=2012/m=11/d=06/h=08 
y=2012/m=11/d=06/h=09 
y=2012/m=11/d=06/h=10 
y=2012/m=11/d=06/h=11 
y=2012/m=11/d=06/h=12 
y=2012/m=11/d=06/h=13 
y=2012/m=11/d=06/h=14 
y=2012/m=11/d=06/h=15 
y=2012/m=11/d=06/h=16 
... 

więc wydaje ten Hive może zobaczyć i zinterpretować mój układ plików z powodzeniem. Jednak żadne rzeczywiste dane nigdy nie zostaną załadowane. Jeśli spróbuję wykonać prosty licznik lub wybrać *, otrzymuję zero:

hive> select count(*) from logs; 
... 
OK 
0 

hive> select * from logs limit 10; 
OK 

hive> select * from logs where y = '2012' and m = '11' and d = '06' and h='16' limit 10; 
OK 

Myśli? Czy brakuje mi jakiegoś dodatkowego polecenia, aby załadować dane poza odzyskiwanie partycji?

Gdybym ręcznie dodać partycję z wyraźnym miejscu, to działa:

mogę tylko napisać skrypt, aby to zrobić, ale czuje się jakbym czegoś brakuje fundamentalnej wrt „odzyskać partycje ".

Aktualizacja # 1

Dzięki błyskotliwej obserwacji i bystrym Joe K w komentarzu poniżej, myślę, że kwestie wrażliwości sprawa może być zaangażowany tutaj.

Pliki są zdecydowanie zorganizowany jak poniższej specyfikacji ścieżki, z skapitalizowanych H (myślę, że to może być jakiś ukłon do formatowania ISO8601):

s3://($BUCKET)/y=2012/m=11/d=09/H=10/ 

tworzę tabelę zewnętrznego ze spec działowej, dokłada właściwa kapitalizacja:

partitioned by (y string, m string, d string, H string) 

(Uwaga na "H"). Robię odzyskiwanie partycji, które zdają się rekurencyjnie przeglądać katalogi i odpowiednio znajdować partycje, ale jakoś (mimo użycia "H" we wszystkich pouczających miejscach) wydaje się, że Hive zapisuje je jako małe litery "h" :

hive> show partitions logs; 
OK 
y=2012/m=11/d=06/h=08 

(Uwaga na "h"). Wygląda więc na to, że Hive może wykryć partycje, ale przechowuje je w małej formie ... Później, gdy szuka danych, ścieżki te są (oczywiście) puste, ponieważ S3 rozróżnia wielkość liter.

Mam zamiar przenieść moje dane do struktury katalogów z małymi literami i sprawdzić, czy to działa ...

UPDATE 2

Rzeczywiście, potwierdziły, że wielką literą „H”, jak nazwa partycji (w układ plików S3) był problem. O ile mogę powiedzieć, jest to, co się dzieje:

  • Mój układ na S3 miał nazwę partycji wielkości liter (h =)
  • Running odzyskiwania partycji poprawnie wykrywa te partycje ...
  • Ale potem są przechowywane wewnętrznie jako małe (h)

Polecenie "odzyskaj partycje" jest rozszerzeniem Hive autorstwa Amazona. Podejrzewam, że błąd jest w tym komponencie. Zgodnie z moją wiedzą, macierzysty Hive nie ma pojęcia o odkrywaniu katalogu głównego dla odkrywania partycji ...

+0

Na wypadek, gdyby ktoś inny wyruszył tą ścieżką, oto dwa bardzo pomocne blogi: http://pkghosh.wordpress.com/2012/05/06/hive-plays-well-with-json/ i https: //sites.google.com/a/khanacademy.org/forge/technical/data_n/running-emr-elastic-mapreduce-on-the-khan-academy-data –

+0

Jedna rzecz, którą zauważam, to to, że twoja kolumna z godzinami ma różne przypadki w różnych częściach twojego posta. Czy to może być częścią problemu? Nie jestem pewien, które części S3/Hive są lub nie są rozróżniane wielkie i małe litery. Co to jest wyjście, gdy wykonujesz 'opisz sformatowaną logs2 partition (y = '2012', m = '11 ', d = '06', h = '08 ')'? –

+0

Joe! Dziękuję Ci! Myślę, że coś knujesz. Zdecydowanie widzę teraz zachowanie, które jest symptomatyczne dla kwestii rozróżniania wielkości liter. Zamierzam zaktualizować moje pytanie z dodatkowymi informacjami. –

Odpowiedz

10

Jest to kwestia przypadku na polu godziny!

Powiązane problemy