2015-05-27 99 views
1

我有一個像以下這樣簡單的傳說工作: ts3Connection - > ts3Get - > tfileinputDelimeted - > tmap - > tamazonmysqloutput。在Amazon S3上使用TfileUnarchive

現在這裏的場景是,我有時候以.txt格式獲取文件,有時候我會在一個zip文件中得到它。 所以,我想使用tFileUnarchive解壓文件,如果它在zip中,或者如果該文件是解壓縮格式,即僅以.txt格式,則繞過tFileUnarchive組件進行處理。

對此非常感謝。

回答

1

這裏的訣竅是將文件檢索和潛在解壓縮分解爲一個子作業,然後將文件處理成另一個子作業。

這裏有一個簡單的例子任務:

Example job layout showing how to conditionally unzip files from S3

正常,您連接到S3,然後你可以列出使用tS3List桶中所有相關的對象,然後通過這個來tS3Get。或者,您可能有另一種方法將您想要下載的相關對象密鑰傳遞給tS3Get。

在上述工作中,我設置tS3Get了獲取每一個通過設置鍵迭代由tS3List組件對象:

((String)globalMap.get("tS3List_1_CURRENT_KEY")) 

,然後將其下載到:

"C:/Talend/5.6.1/studio/workspace/S3_downloads/" + ((String)globalMap.get("tS3List_1_CURRENT_KEY")) 

我添加的額外位開始於tS3Get的條件鏈接Run If,它將tFileUnarchive與條件鏈接在一起:

((String)globalMap.get("tS3List_1_CURRENT_KEY")).endsWith(".zip") 

它檢查從S3下載的文件是否爲.zip文件。

的tFileUnarchive組件然後只需要告訴解壓什麼,這將是我們剛剛下載的文件:

"C:/Talend/5.6.1/studio/workspace/S3_downloads/" + ((String)globalMap.get("tS3List_1_CURRENT_KEY")) 

以及在哪裏它解壓到:

"C:/Talend/5.6.1/studio/workspace/S3_downloads" 

這然後將提取的文件放在與不需要提取的文件相同的地方。

從這裏我們現在可以通過下載遍歷文件夾尋找我們想通過我的情況下設置的目錄"C:/Talend/5.6.1/studio/workspace/S3_downloads"和全球表達"*.csv"的文件類型,因爲我想讀僅在CSV文件(包括壓縮)我在S3中。

最後,我們再通過設置文件中讀取分隔的文件由tFileInputDelimited組件作爲閱讀:

((String)globalMap.get("tFileList_1_CURRENT_FILEPATH")) 

而且在我的情況只是那麼我打印這個控制檯,但很明顯,你會再想要在上傳到AWS RDS實例之前執行一些轉換。

+0

感謝您的回覆。但我在這裏遇到了一些問題。 第一個是我在S3上有一個桶,假設'分析',裏面有'May2015'等明智的月份文件夾。因此,tfileUnarchive正在提取文件夾,即在創建May2015/File.txt時指定的路徑中,並在嘗試使用tfilelist對其進行迭代時無法找到該文件。 同樣在這裏你已經展示瞭如何從本地系統做到這一點,但如果我想通過EMR集羣來運行它,那麼我該如何實現它。 請指導我。 – user3454116

+0

您需要將其分解爲多個問題以保持清晰簡潔。我建議創建一個新的問題鏈接回這個問題,顯示你在獲得上述答案之後現在已經做了什麼,然後更具體地滿足你的需求(所以問題標題可能類似於「在嵌套文件夾結構上使用tFileUnarchive在S3「)和上述答案並不完全覆蓋你的新問題。如果/一旦得到答案,我會提出另一個關於如何將這個答案應用於EMR集羣/ MapReduce作業的問題。 – ydaetskcoR

+0

嗨, 感謝您解壓縮文件並閱讀它的解決方案。 關於我的嵌套文件夾結構的第一個查詢,做了一些研究後,我想我已經完成了它。我檢查了tfilelist組件中的include子目錄選項,它似乎工作。 另外,如果您對我的第二個查詢有任何想法,請讓我知道。 – user3454116