2015-05-27 3 views
1

У меня есть работа с талантом, которая проста, как показано ниже: ts3Connection -> ts3Get -> tfileinputDelimeted -> tmap -> tamazonmysqloutput.Использовать TfileUnarchive на Amazon S3

Теперь сценарий заключается в том, что несколько раз я получаю файл в формате .txt, а иногда получаю его в zip-файле. Итак, я хочу использовать tFileUnarchive, чтобы распаковать файл, если он находится в zip или обрабатывает его в обход компонента tFileUnarchive, если файл находится в распакованном формате, но только в формате .txt.

Любая помощь на это очень ценится.

ответ

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")) 

Дополнительный бит, который я добавил, начинается с условной ссылки Run If от tS3Get, которая связывает 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, предположим, что «Анализ» и внутри, что у меня есть месячная папка типа «май2015» и так далее. Таким образом, tfileUnarchive извлекает с помощью папки i.e в указанном пути, который создает файл May2015/File.txt, и при попытке выполнить итерацию с помощью tfilelist он не сможет найти файл. Также здесь вы показали, как это сделать из локальной системы, но если я хочу запустить ее через кластер EMR, то как мне ее достичь. Направьте меня на это. – user3454116

+0

Вам нужно разбить это на несколько вопросов, чтобы они были четкими и лаконичными. Я бы предложил создать новый вопрос, связанный с этим вопросом, показывая, как вы это сделали после получения вышеуказанного ответа, а затем более конкретно с вашими требованиями (Таким образом, заголовок вопроса может быть чем-то вроде «Использование tFileUnarchive для структуры вложенных папок в S3 "), и где приведенный выше ответ не совсем охватывает ваш новый вопрос. Если/после ответа на этот вопрос я задал еще один вопрос о том, как применить этот ответ к задаче EMR cluster/MapReduce. – ydaetskcoR

+0

Привет, Спасибо за решение распаковать файлы и прочитать их. Что касается моего первого запроса вложенных структур папок, после некоторых исследований я предполагаю, что я это сделал. Я проверил параметр include subdirectories в компоненте tfilelist и, похоже, работает. Также, если у вас есть идеи по моему второму запросу, дайте мне знать. – user3454116