Схему задал, и вперёд.
A. Так в датакукере схему вообще задавать не нужно, он изначально schema-less. Если нужно обратиться к атрибуту объекта по имени, просто пишем его имя, и всё.
С табличными данными, чтобы обращаться к полям, имена задавать нужно (но при создании DS ненужные поля можно просто пропускать), а вот указывать их тип — нет. Тип всегда автоматически выводится при обращении к полю в выражении. Можно просто передать список полей в процесс при запуске (например, через командную строку, или файл параметров), и этого будет достаточно.
И никакой обвязки для инференса типов вообще не требуется.
Q. Ну вроде ладно. А что там было про подключаемые функции?
A. Есть API для расширения на Java, ориентированное на уровень Spark RDD.
Подключаемые функции бывают для адаптеров хранилищ (например, чтобы использовать источник JDBC), для трансформаций (например, можно написать читалку из XML текста в структурированный объект), для операций — запакованных алгоритмов, расширяющих возможности языка.
Писать собственные функции несложно. В стандартной поставке примерно по 20 трансформаций и операций, и по паре штук адаптеров хранилищ на чтение и на запись, так что кода для использования в качестве примера более чем достаточно.
Q. Что там было про циклы?
A. Для упрощения реализации логики в процессах ETL, в языке есть поддержка операторов контроля процесса исполнения (LOOP, IF) и динамически вычисляемых переменных (например, LET $arr = SELECT DISTINCT property FROM data_set).
Кроме того, все строки интерполируемые, то есть, имена наборов данных, например, можно вычислять прямо в рантайме. Так что в большинстве случаев можно обходиться без каких-то дополнительных обвязочных скриптов, и весь процесс целиком писать на SQL, просто передавая параметры во время запуска.
Q. Ну, допустим, что-то написали. А отлаживаться как?
A. У датакукера есть интерактивный отладчик с REPL, в котором можно пошагово писать и отлаживать скрипты, вызывать любые подключаемые функции (с автодополнением параметров), и заглядывать в наборы данных. А также смотреть статистику, и всё такое прочее.
Более того, режим этот может работать как локально, так и удалённо, когда сам движок запущен на кластере, а консоль с локальной машины обращается к нему через REST.
Q. Это что, какой-то отдельный артефакт?
A. Нет, что вы. Вся функциональность инструмента запакована в один FatJAR, у которого нет никаких внешних зависимостей. Но есть много режимов запуска — для разных окружений.
И вообще, сборка простая (многомодульный Maven проект с профилями), но продвинутая. Например, документация по подключаемым функциям автоматически собирается в HTML и PDF прямо из исходника, включая примеры SQL скриптов — с раскраской синтаксиса.
Q. О как, и такие плюшки, значит. Ну что ж, удачи вам.
A. Спасибо! Однако, прошу заметить, что мы ведь не первый год используем датакукер в проме, и вполне успешно ETL-им терабайты данных каждый день. Точно даже не скажу, сколько уже отъетлили, счёт идёт на десятки тысяч процессов (если считать в обработанных записях, то будут, вероятно, триллионы). Просто, чтобы открыть код, руки дошли только сейчас.
Более того, в нашем приватном форке куча аналитических алгоритмов в виде подключаемых функций реализована, так что не только ETL, но и аналитику мы тоже делаем им же самым.
Короче, не какое-нибудь экспериментальное фуфло, а достаточно зрелый продукт с практикой эксплуатации. Так что мы с большим удовольствием научим, как правильно готовить ETL процессы на Data Cooker. И поможем внедрить.
Обращайтесь к нам через группу в телеге, не стесняйтесь :)
Что будет, если обратиться к коллекции, где у какого-то объекта нет нужного атрибута? Вернётся null? Такие объекты будут пропущены? Будет исключение? А если такого атрибута нет ни у одного объекта в коллекции?
Если нужно посчитать какую-нибудь сумму или максимум по атрибуту для всех объектов в коллекции, но у всех объектов они разного типа, что произойдет? Автоматическое приведение к типу, который требует операция? Будут просто пропущены объекты с атрибутами несовпадающего типа? Будет взят тип из первого объекта в коллекции?
если атрибута нет, вернётся NULL. нет, не будут пропущены. нет, не будет исключений. вернутся NULL для всех объектов.
какому
смотря какой оператор для суммы. если + то к Numeric, если || то к String, если OR то Boolean и т.д.
Обсуждают сегодня