Jestem totalnie hadoop n00b. Próbuję rozwiązać następujące problemy jako mój pierwszy projekt hadoop. Mam ponad milion podfolderów w amazonowym wiaderku S3. Każdy z tych folderów ma dwa pliki. Plik 1 zawiera następujące dane:
date,purchaseItem,purchaseAmount
01/01/2012,Car,12000
01/02/2012,Coffee,4
....................
Plik2 zawiera informacje o kliencie w następującym formacie:
ClientId:Id1
ClientName:"SomeName"
ClientAge:"SomeAge"
Ten sam wzór powtarza się we wszystkich folderach w wiadrze.
Zanim napiszę wszystkie te dane do HDFS, chcę dołączyć do File1 i File2 w następujący sposób:
Dołączony plik:
ClientId,ClientName,ClientAge,date,purchaseItem,purchaseAmount
Id1,"SomeName","SomeAge",01/01/2012,Car,12000
Id1,"SomeName","SomeAge",01/02/2012,Coffee,4
Muszę to zrobić dla każdego folderu inastępnie podaj ten połączony zestaw danych do HDFS. Czy ktoś może mi wskazać, jak mógłbym osiągnąć coś takiego w Hadoop. Popchnięcie we właściwym kierunku będzie bardzo mile widziane.
Odpowiedzi:
3 dla odpowiedzi № 1Szybko przychodzi mi na myśl implementacja kaskadowa.
Zastanów się, jak programowo zamienić wiersze w kolumny dla File2, abyś mógł iterować po wszystkich folderach i przetransponować plik, tak aby Twoja pierwsza kolumna była pierwszym rzędem.
Tylko dla jednego podfolderu: Być może utworzenie dwóch programów a TextDelimited
Schemat dla pliku 1 i a TextLine
Schemat dla pliku 2. Ustaw je jako Taps
następnie zawiń każdy z nich w MultiSourceTap
to łączy wszystkie te pliki w jeden Pipe
.
W tym momencie powinieneś mieć dwa osobne MultiSourceTaps
jeden dla wszystkich plików File1 i jeden dla wszystkich plikówFile2 (s). Pamiętaj o niektórych szczegółach pomiędzy nimi, najlepiej po prostu ustawić to dla jednego podfolderu, a następnie iterować w innych milionach podfolderów i wysyłać je do innego obszaru, a następnie użyć hadoop fs -getmerge
aby zebrać wszystkie małe wyjściowe pliki w jeden duży.
Trzymając się motywu Kaskadowe, możesz budować Pipe
s, aby dodać nazwę podfolderu za pomocą new Insert(subfolder_name)
wewnątrz i Each
funkcja, aby oba zestawy danych zawierały odwołanie do podfolderu, z którego przyszedł, aby połączyć je ze sobą, a następnie ... Połącz je za pomocą kaskadowania CoGroup
lub Hive-QL Join.
Może być znacznie łatwiejsze wdrożenie niż to, ale to właśnie przychodzi mi na myśl szybkie myślenie. :)
TextDelimited, TextLine, MultiSourceTap
0 dla odpowiedzi nr 2
Spójrz na CombineFileInputFormat.