2012-12-21 70 views
2

我想寫一個自定義加載udf在豬中用於加載目錄結構中的文件。pig load udf從幾個子目錄加載文件

目錄結構就像一個電子郵件目錄,它有一個名爲maildir的根目錄。在這裏我們有個別郵件持有者的子目錄。在每個mailaccount持有者目錄中有幾個子目錄,如收件箱,發送,垃圾等。

如:郵件目錄/ mailholdername1 /收件箱/ 1.txt的 郵件目錄/ mailholdername2 /發送/ 1.txt的

我想從所有mailerholdername子目錄只讀收件箱文件。

我無法理解:

  1. 什麼應該被傳遞到負載UDF爲參數
  2. 應如何整個目錄結構進行解析的只有各自的收件箱中的文件被讀取。

我要處理一個文件,並執行一些數據提取和加載它作爲一個record.Hence如果有10個文件,我得到有10個記錄 的關係。此外,我想要做的這些收件箱中的一些操作文件並提取一些數據。

+0

您可以顯示迄今爲止所做的工作嗎? – rsp

+0

實際上我已經通過核心java.be來完成此操作了,但是閱讀和處理abt 3 gb這樣的巨大文本文件是非常耗時的,因此我切換到了pig.But現在我無法完成第一步...數據是完全非結構化的。它像我們寫的一個正常的電子郵件文本文件。因此,我們不能直接加載它們,因爲沒有模式...所以我無法進一步移動.. –

+0

嗨Shrey,你有答案。 –

回答

1

因爲你不具有可變深度定義的文件夾結構,我認爲這是因爲通過以下方式爲您的輸入路徑一樣簡單:

A = LOAD 'maildir/*/inbox/1.txt' USING PigStorage('\t') AS (f1,f2,f3) 

你可能並不需要創建爲此,PigLoader應該能夠處理它們,假設它們處於某種分隔格式(以上示例假定3個字段,製表符分隔)。

如果每個收件箱中有多個txt文件,請使用*.txt而不是1.txt。最後,如果maildir根目錄不在用戶主目錄中,則應使用該文件夾的絕對路徑,例如/data/maildir/*/index/*.txt

+0

嗨克里斯,謝謝你的答覆。但實際上問題是,我想一次處理所有的郵件持有人的收件箱文件。假設有200個郵件持有者(根目錄maildir下的子目錄),我不想寫LOAD爲個人收件箱子目錄。我想提及根目錄和只加載所有子目錄的收件箱文件。我不知道如何做到這一點,並不確定是否UDF是解決方案,以及如何... –

+0

你不需要寫每個郵箱的加載語句,上面的'glob'將確保所有的郵箱都會被加載 –

+0

okk ...是的,這將加載我需要的所有文件。現在的實際問題是這些文本文件實際上是電子郵件。我需要從這些郵件中提取某些屬性(及其值),例如TO,FROM,SUBJECT,DATE等。每個文本文件應該生成一條記錄。如果所有收件箱中有100封郵件,則我的關係A(如加載st應該包含100條記錄。我該如何處理...因爲LOAD語句處理結構化數據(AS(f1,f2)等),但是這裏的數據是非結構化的。我將不得不首先提取我需要使用的一些屬性處理。任何想法如何? –