Преобразование Данных Или Углубление В Talent Open Studio

Утро было вполне обычное и ленивое: душ, кофе, сигарета.

Пора собираться на работу.

По приезду в офис меня встретили новостью о переходе на новый проект в качестве ETL-инженера (не знал, что это значит, ну да ладно).

Что ж, думаю, попробуем.

До меня там работал один парень, но особой помощи по работе от него я как всегда не получил.

Итак, давайте начнем.

Что такое ЭТЛ? Вот что он говорит об этом вики : ETL (от англ.

Extract, Transform, Load — буквально «извлечение, преобразование, загрузка») — один из основных процессов управления хранилищем данных, который включает в себя:

  • извлечение данных из внешних источников;
  • их трансформация и очистка (англ.

    Datacleaning) так, чтобы они соответствовали потребностям бизнес-модели;

  • и загрузка их в хранилище данных.

Думаю, это более-менее понятно.

Суть моей задачи заключалась в том, чтобы извлечь данные из некоего .

xls-документа, преобразовать их по типу (большинство полей определялись как строковые), что-то посчитать (в зависимости от конкретного случая) и записать всё это в базу данных.

После того, как довел до ума звездная схема что это такое, ты можешь прочитать там же вики .

Так.

Проблема решена.

Использовался для работы Талант Открытая Студия , я накопал пример как и что делать.

И началась очень долгая и нудная работа по копипасту.

Вот так выглядит упрощенный пример преобразования данных и запись в базу данных:

  • Проект создан;
  • К нему добавляется источник данных; (в нашем случае .

    xml-документ);

  • Добавляется получатель данных (таблица в MySQL);
  • Создать новую работу;
  • В него помещаем источник и место назначения, а также компонент среды tMap;
  • В нем указываем преобразование данных для каждого поля (например, конверт toInt || toFloat, удаляем ненужные символы типа "%" и так далее;
  • Нажмите на наше задание, чтобы выполнить его, и посмотрите, что произойдет;
Вот как визуально выглядит простой пример Job в TOS

Преобразование данных или углубление в Talent Open Studio

Были случаи, когда приходилось писать довольно длинную проверку валидности данных, их парсинг и т.д. После нескольких таких задач и назойливого копипаста созрела идея оптимизации процесса, как оказалось, в в этой IDE можно писать свои собственные статические публичные классы.

Первый класс преобразования данных был написан за пару минут. И сразу объем марудной работы значительно сократился.

Если, например, вам приходилось каждый раз копировать и вставлять:

obj.toString().

equals("#") || obj.toString().

equals("") || obj==null ? null Integer.parseInt(StringHandling.EREPLACE(obj.toString().

replace(" ", "").

substring(0,obj.toString().

replace(" ", "").

indexOf(".

")),"\\xA0", ""))

тогда все делалось одной строкой

routines.Convert.toInteger(obj)

Но, как говорится, не все так просто, особенно если вам приходится проводить какие-либо операции с какими-то данными, а тем более, если вам приходится работать с данными из предыдущего пакета, поскольку в Talent Open Studio данные передаются в строках.

, а не во всем массиве, и можно получить доступ.

С предыдущей областью не все так просто, точнее, я до сих пор не нашел другого способа, кроме использования буферных компонентов.

Точнее, стоит следующая задача: у нас есть набор значений со следующими полями: «Год», «Квартал», «НачалоОтЯн1», «НекотороеЗначение1», «НекотороеЗначение2», «НекоеЗначение3» поле НачинаетсяСЯн1 может принимать значения «Y» (истина) или «N» (ложь).

Если поле «StartsFromJan1» принимает значение «Y» (истина), то эту строку необходимо обрабатывать по ряду правил, если «N» то оставляем как есть.

Например, обработка может происходить следующим образом: из ячейки текущей строки вычитается соответствующая ячейка предыдущей строки (если Q4, то вычитаем Q3), с учетом того, что если значение поля в ней StartsFromJan1 == N, затем вычитаем минус еще одну строку и так до тех пор, пока не дойдем до Q1, но если поле StartsFromJan1 == Y находится в отнимаемой строке, то на этом и останавливаемся; для наглядности приведу пример данных:

Год Четверть НачалоС1 Янв.

Некоторые значения Некоторые значения
2009 1 квартал Н 3000 4000
2009 2 квартал Да 3500 5000
2009 3 квартал Н 4000 6000
2009 4 квартал Да 5000 7000
2009 1 квартал Н 3500 4400
2009 2 квартал Да 3400 5600
2009 3 квартал Н 4500 6500
2009 4 квартал Да 5600 7800


в нашем случае первое остается неизменным, из второго вычитаем первое, третье не трогаем, из четвертого вычитаем 3 и 2

При разработке задачи возникли следующие проблемы
  • Вычисление данных, если поле «StartsFromJan1» принимает значение «Y»
  • Фильтрация пустых строк
  • Минимизируйте количество ручной работы
Для решения первой проблемы на помощь пришли те же статические классы.

Я использовал 3 одномерных массива (три, потому что строка, в которой Quarter == Q1 всегда имеет значение «N» для поля «StartsFromJan1»), была создана некая переменная типа Int, которая после каждой обработанной ячейки увеличивалась на единицу, а после обработки последней ячейки строки и перехода к следующей сбрасывалась.

Далее был создан метод, который преобразовывал входящие данные и записывал их в массив; он также сбрасывает массив при переходе от Q4 к Q1. И в последнем методе он вытаскивал данные из массива, смотрел, нужно ли считать входящий параметр, а затем вызывал метод добавления в массив и возвращал посчитанное или не посчитанное значение (в зависимости от параметра «StartsFromJan1») .

Далее в компоненте tMap вызывался этот метод, которому передавались значения «StartsFromJan1», «Quarter», «someValue»… Проблема с пустыми строками.

сначала мы просто сокращали количество строк для чтения из файла, но это решение было временным, так как объем данных со временем увеличивается.

Решение пришло в виде компонента tFilterRow, который просто задавал какое-то выражение для фильтрации, например Year! = ноль || Year!="", все значения, удовлетворяющие условию, прогонялись через tMap. После проведения описанных оптимизаций время разработки одного набора данных сократилось на несколько порядков, объем работы также стал заметно меньше, хотя по большей части все делалось из-за огромного нежелания делать однотипные работы.

долгосрочная работа, особенно если речь идет о копипасте.

Теги: #java #etl #tos #Чулан #Talent Open Studio

Вместе с данным постом часто просматривают: