{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Подготовка датасета при помощи Talend Open Studio for Data Integration.\n", "\n", "\n", "Как говорят более опытные камрады, 80-90% работы дата сайнтиста - это подготовка данных.\n", "\n", "В связи с этим я решил написать небольшой вводный туториал с примерами использования Talend Open Studio for Data Integration (далее TOS).\n", "Это открытое IDE на базе Eclipse для интеграции данных, которое позволяет разрабатывать процессы преобразования данных в виде исполняемых JAR-файлов или программ на Perl-е (job-ы, в терминологии TOS), которые уже можно запускать вручную или повесить на cron/планировщик задач Windows. Также TOS можно испольльзовать для моделирования бизнес-процессов. Если верить разработчикам TOS, используя этот инструмент можно разработать сложное приложение для интеграции/оркестрации/etc приблизительно на порядок быстрее, чем если это делать руками. Фактически, TOS является \"генератором кода\", который позволяет набросать граф преобразования данных при помощи готовых компонентов и соединений, настроить узлы и связи и получить готовое приложение без программирования (в простом случае).\n", "\n", "\n", "Сразу оговорюсь, что продукт очень большой, и я сам знаю его достаточно поверхностно.\n", "Поэтому я сейчас вкратце опишу плюсы и минусы и границы применимости, чтобы вы могли решить, насколько оно вам нужно.\n", "\n", "Плюсы:\n", "- огромное количество готовых компонентов, порядка 800+ штук, для самых разных задач, от работы с BigData/Cloud-сервисами/Разнообразными базами данных/Многочисленными форматами файлов/маппинга/агрегации, и т.д.\n", "- TOS является продуктом компании Talend, расположенной во Франции, у которой также есть ряд платных инструментов(для всяких там Big Data и Natural Language Processing, например), так что можно не бояться что разработку и поддержку TOS могут забросить в обозримом будущем. Также TOS является частью целой экосистемы родительской компании, по нему есть учебные курсы и сертификации (если вдруг нужно).\n", "- TOS бесплатен.\n", "\n", "Минусы:\n", "- Если вам нужно что-от нетиповое, вам прийдется писать свои компоненты на Java.\n", "- Чтобы разобраться в функционале и интерфейсе TOS может потребоваться достаточно много времени.\n", "- Во многих случаях может быть все-таки быстрее написать руками(если вы опытный программист). \n", "\n", "По моему опыту, TOS может быть полезен либо если задача настолько простая и типовая, что её можно быстро реализовать из набора знакомых вам готовых компонентов без долгово вникания и чтения документации, или если вы разрабатываете что-то действительно очень большое и сложное, и реализовывая это руками можно утонуть в коде, который потом ещё и поддерживать прийдется. Во втором уже может быть разумным инвестировать время в освоение нового инструмента, и написание на Java компонентов, недостающих именно под ваши задачу. \n", "Основной проблемой при изучении TOS и работе с нею для меня стало то, что интерфейс во многом неинтуитивный, а читать пол тысячи страниц документации(и это довольно поверхностно), чтобы выполнить запланированную на два дня работу хочется далеко не всегда.\n", "\n", "Так что этот инструмент хорошо подойдет тем, кто часто сталкивается с необходимостью выполнять различные задачи по интеграции данных между разными хранилищами (например интернет-магазина и системы складского учета), собиру и агрегации различных данных для последующего анализа, синхронизации баз данных, и т.д.\n", "И плохо подойдет тем, кто с такими задачами сталкивается редко и хорошо умеет программировать - таким проще будет написать самим.\n", "\n", "Итак, допустим что нам нужно на основе покупок в электронном магазине собирать в определенном формате данные о пользователе, сделанных им покупках, возвратах, прочих данных. На основе этой информации мы, в дальнейшем, можем попытаться сделать, например, кластеризацию пользователей на \"хороших\" и \"плохих\" с тем чтобы выяснить какие способы рекламы выгоднее использовать, чтобы привлекать больше \"хороших\".\n", "\n", "Предположим, что большую часть данных мы получаем напрямую из базы данных, а часть - через сервис, который выгружает нам данные в формате csv (на практике вместо компонента для csv-файла может быть компонент для SOAP, CRM или ERP системы, и т.д.).\n", "\n", "Итак, качаем TOS с официального сайта Talend. Это здесь. https://www.talend.com/products/data-integration/\n", "Там есть версии и для Windows, и для Mac, и для Linux, обо всех позаботились.\n", "\n", "Разархивируем и открываем TOS, создаем новый проект, когда он добавлен в список имеющихся - выбираем и открываем его (нажимаем кнопку Finish).\n", "\n", "\n", "\n", "Далее в новом проекте у меня обычно открывается почему-то пустое окно приветствия, закрываем его.\n", "\n", "Перед нами окно TOS, в правой части палитра (если мы только открыли проект она будет пустой) и слева у нас сам проект.\n", "Давайте создадим новую работу, для этого сделаем правый клик на пункте Job Designs->Create job\n", "\n", "\n", "\n", "\n", "Когда мы выберем новую работу, у нас появится палитра компонентов.\n", "\n", "Также было бы удобно сразу создать подключение к базе данных.\n", "Для этого мы можем в пункте Metadata выбрать подпункт Db Connections и создать новое подключение, например к MySql-серверу, указав параметры подключения и проверив работоспособность.\n", "\n", "\n", "\n", "Далее, в палитре справа выберем компонент tMysqlInput и перетащим его мышкой на клечатое поле дизайнера. Дважды кликнем на добавленный элемент, и в открывшемся меню компонента мы можем или непосредственно ввести настройки подключения, или выбрать Property Type как Repository и выбрать наше подключение из списка уже созданных.\n", "\n", "\n", "\n", "Также добавляем на поле дизайнера tFileInputDelimited, tMap, tUnite, tFileOutputDelimited, и tFtpPut (последний служит для отправки готового файла по ftp, сначала его можно не добавлять и отладить схемы локально).\n", "\n", "Далее, соединяем их перетаскивая мышкой связи от одного к другому, приблизительно вот таким вот образом:\n", "\n", "\n", "\n", "\n", "Теперь нам нужно настроить эти компоненты и связи между ними.\n", "\n", "Например, для tFileOutputDelimited (условного csv-файла) мы указываем путь к файлу и разделитель.\n", "После этого редактируем схему данных для этого файла, приблизительно так: \n", "\n", "\n", "\n", "Теперь пишем SQL-запрос для нашего компонента tMysqlInput (желательно в каком-то нормальном редакторе, в TOS это делать будет очень неудобно) и вставляем его в пункт Query. Например, что-то вот такое:\n", "\n", "```sql\n", "SELECT entity_id,customer_email, total_paid,customer_firstname,customer_lastname \n", "FROM sales_flat_order \n", "WHERE total_paid > 1500 \n", " AND total_paid < 2000 \n", "```\n", "\n", "После этого делаем двойной клик на tMap. Этот компонент у нас служит для маппинга данных, как следует из его названия. В данном конкретном случае я делаю предположение, что данные из файла и из базы данных поступили к нам в немного разных форматах, и мы их приводим данные из файла к одному формату, чтобы можно было в дальнейшем обьеденить данные при помощи компонента tUnite. Можно просто взять и перетащить мышкой поля из левой части в правую. В более сложном случае можно поменять имена полей, отформатировать, сделать какие-то более интересные преобразования.\n", "\n", "\n", "\n", "\n", "После этого настраиваем остальные связи на схеме аналогичным образом, и параметры выходного файла, не забыв зайти в Advanced settings и снять галочку с пункта \"Throw error if the file already exist\". В имени файла можно использовать, например, временную метку, чтобы можно было отличить файлы по дате и времени создания.\n", "\n", "Если мы все сделали правильно, то граф преобзазования данных готов. Жмем на Run (бело-зеленая стрелка вверху) и получаем приблизительно вот такой результат:\n", "\n", "\n", "\n", "Да, все компоненты можно переназвать как удобно.\n", "\n", "Теперь, при желании, можно добавить дополнительно tFtpPut, настроить прямо внутри элемента, или создать контекст, найдя в навигаторе проекта слева одноименный пункт, и вписав в контекст переменные, которые можно использовать в качестве настроек в любом месте проекта. \n", "\n", "\n", "\n", "Также мы можем на сделать правый клик на полученный job, и сделать \"Build job\", по итогу которого получим в указанном нами месте архив с исходным кодом, метаданными, и собственно jar-файлом.\n", "\n", "Как видите, в нашем случае все довольно просто. Функционал TOS гораздо богаче, но я не знаю его достаточно глубоко, поэтому просто придерживаюсь простого правила - я стараюсь делать при помощи SQL и кода до/после максимальное количество работы, а на долю Talend-а оставляю максимально простую схему.\n", "\n", "Собственно, все. Критикуйте, дополняйте. поправляйте, спрашивайте - я охотно исправлю и дополню этот мануал, если это будет нужно." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 2 }