Искусство ETL. Пишем собственный движок SQL на Spark [часть 7]

Поделиться
  • 23 августа

В предыдущих сериях (FAQ 1 2 3 4 5 6 ) мы весьма подробно рассмотрели, как написать на Java собственный интерпретатор объектно-ориентированного диалекта SQL поверх Spark RDD API, заточенный на задачи подготовки и трансформации наборов данных.

В данной части поговорим о том, как добавить в собственный диалект SQL поддержку процедур. Например,

— library.tdl

CREATE PROCEDURE dwellTimeByMode(@signals, @target, @outPrefix,
@modes = [‘pedestrian’, ‘non_pedestrian’, ‘car’, ‘bike’],
@groupid=’cell10′) AS BEGIN
LOOP $mode IN $modes BEGIN
SELECT * FROM $signals INTO “{$signals}/{$mode}” WHERE mode=$mode;

CALL dwellTime(@signals_userid_attr=userid,
@target_userid_attr=userid,
@target_grouping_attr=$groupid
) INPUT signals FROM “{$signals}/{$mode}”, target FROM $target
OUTPUT INTO “{$outPrefix}/{$mode}”;

ANALYZE “{$signals}/{$mode}”;
ANALYZE “{$outPrefix}/{$mode}”;
END;
END;

— … — … — … —

— script.tdl

CALL dwellTimeByMode(@signals=$this_month, @target=$population, @outPrefix=$this_month);

Нафига это надо?

Ну, допустим, у нас уже есть некоторое количество SQL ETL кода, наработанного за время эксплуатации инструмента в продакшене, и становится заметно, что значительная часть скриптов на разных проектах совпадает, и из раза в раз повторяется. Логично было бы вынести все эти совпадающие куски в библиотеку, чтобы держать в одном месте, да и вызывать с какими надо параметрами, когда надо. Вот прям как на примере выше.

Читать дальше →