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 ...
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 –
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 ')'? –
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. –