2013-03-07 93 views
2

我是一個完整的hadoop n00b。我正在努力解決以下問題,作爲我的第一個hadoop項目。我有一百萬個子文件夾坐在亞馬遜S3存儲桶中。每個文件夾都有兩個文件。文件1中有數據如下:使用hadoop加入兩個文件在同一目錄中

date,purchaseItem,purchaseAmount 
01/01/2012,Car,12000 
01/02/2012,Coffee,4 
.................... 

文件2在以下格式的客戶的信息:所有的文件夾重複在桶

ClientId:Id1 
ClientName:"SomeName" 
ClientAge:"SomeAge" 

同樣的模式。

之前我寫的所有數據到HDFS,我想加入文件1和File2如下:

註冊文件:

ClientId,ClientName,ClientAge,date,purchaseItem,purchaseAmount 
Id1,"SomeName","SomeAge",01/01/2012,Car,12000 
Id1,"SomeName","SomeAge",01/02/2012,Coffee,4 

我需要爲每一個文件夾,然後喂做到這一點這個連接的數據集轉化爲HDFS。有人可以指出,我將如何在Hadoop中實現這樣的功能。向正確的方向推進將非常感激。

+0

可能是你可以考慮,加載這些文件以編程RDBMS像MySQL數據庫,他們加入到表在數據庫和使用Sqoop轉儲表HDFS。我認爲這非常直截了當。 – Alper 2013-03-07 08:41:03

+0

@Alper - 謝謝。我正在考慮更多地使用map作業來確定fileNames,它是/ path/to/file1和一些/ path/to/file2。「some/path/to」可以用作鍵,值將是File1的行條目和File2的分析內容。在縮小階段,我在考慮是否可以根據關鍵字「some/path/to」加入條目。我幾乎對Map-Reduce幾乎一無所知,所以也許這不是要走的路。 – 2013-03-07 08:56:46

+0

你必須小心如何使用hadoop和mapreduce作業,當你在hdfs中有大量內容的文件時,Hadoop會發揮它的魔力。我無法理解你的方式,但將你的文件移動到hdfs系統似乎不適合mapreduce解決方案。 – Alper 2013-03-07 09:50:35

回答

3

快速思考的是級聯實現。

找出一種方法,以編程方式將您的行轉換爲File2的列,以便您可以遍歷所有文件夾並轉置該文件,以便第一列是第一行。

只是一個子文件夾: 兩個方案一個TextDelimited方案文件1和TextLine方案文件2.設置這些爲Taps然後包每一種可能設置爲MultiSourceTap這樣可以將所有這些文件合併爲一個Pipe

此時,您應該有兩個獨立的MultiSourceTaps一個用於所有File1(s),另一個用於所有File2(s)。 請記住這裏的一些細節,最好將其設置爲一個子文件夾,然後遍歷其他幾百個子文件夾並輸出到其他區域,然後使用hadoop fs -getmerge將所有輸出小文件合併爲一個大的一個。

與層疊主題保持一致,那麼你可以構建Pipe s到添加使用new Insert(subfolder_name)Each功能,使您的兩個數據集必須來自的子文件夾的引用,它們連接在一起,然後將子文件夾名稱...加入他們使用級聯CoGroup或Hive-QL加入。

可能比這更容易實現,但這是想到很快想到的。 :)

TextDelimitedTextLineMultiSourceTap

+0

這看起來很有希望。謝謝! – 2013-04-04 05:32:05

+0

很高興你發現它很有用! – Engineiro 2013-04-04 13:45:34

相關問題