/ / Łączenie dwóch plików w tym samym katalogu przy użyciu hadoop - join, hadoop, mapreduce, hdfs, przetwarzanie plików

Łączenie dwóch plików w tym samym katalogu przy użyciu hadoop - join, hadoop, mapreduce, hdfs, przetwarzanie plików

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 № 1

Szybko 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ć Pipes, 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.