GNU сделать зависимости для обработки данных - PullRequest
2 голосов
/ 19 декабря 2011

Я пытаюсь настроить систему ETL, используя GNU Make 3.81.Идея состоит в том, чтобы преобразовать и загрузить только то, что необходимо после изменения моих исходных данных.

Макет каталога моего проекта выглядит следующим образом:

${SCRIPTS}/        <- transform & load scripts
${DATA}/incoming/  <- storage for extracted data
${DATA}/processed/ <- transformed, soon-to-be-loaded data

Мой $ {TRANSFORM_SCRIPTS} / Makefile isзаполненный такими утверждениями:

A_step_1: ${SCRIPTS}/A/do_step_1.sh ${DATA}/incoming/A_files/*
        ${SCRIPTS}/A/do_step_1.sh ${DATA}/incoming/A_files/* > ${DATA}/processed/A.step_1

A_step_2: ${SCRIPTS}/A/do_step_2.sh ${DATA}/processed/A.step_1
        ${SCRIPTS}/A/do_step_2.sh ${DATA}/processed/A.step_1 > ${DATA}/processed/A.step_2

B_step_1: ${SCRIPTS}/B/do_step_1.sh ${DATA}/incoming/B_files/*
        ${SCRIPTS}/B/do_step_1.sh ${DATA}/incoming/B_files/* > ${DATA}/processed/B.step_1

B_step_2: ${SCRIPTS}/B/do_step_2.sh ${DATA}/processed/B.step_1
        ${SCRIPTS}/B/do_step_2.sh ${DATA}/processed/B.step_1 > ${DATA}/processed/B.step_2

joined: A_step_2 B_step_2
        join ${DATA}/processed/A.step_2 ${DATA}/processed/B.step_2 > ${DATA}/processed/joined

При вызове 'make join' успешно создается нужный мне "присоединенный" файл, но он каждый раз перестраивает каждый файл, несмотря на то, что в файлах зависимостей нет никаких изменений.

Я пытался использовать имена выходных файлов в качестве целей, но GNU Make, похоже, не знает, как справиться:

${DATA}/processed/B.step_2: ${SCRIPTS}/B/do_step_2.sh ${DATA}/processed/B.step_1
        ${SCRIPTS}/B/do_step_2.sh ${DATA}/processed/B.step_1 > ${DATA}/processed/B.step_2

Любые предложения, кроме отбрасывания вывода каждого процесса в текущей работекаталог?Make кажется разумным инструментом для выполнения этой работы, потому что на самом деле существуют десятки источников данных и около 100 шагов в целом, а само управление зависимостями через файлы сценариев становится слишком сложным.

1 Ответ

2 голосов
/ 19 декабря 2011

Вы можете сделать одну из двух вещей:

Либо исправьте цель и ее зависимости что-то вроде:

  JOINED=${DATA}/processed/joined 

  $(JOINED): ${DATA}/processed/A.step_2 ${DATA}/processed/B.step_2

или в шагах вы можете завершить каждый шаг с помощью

  touch $@

например:

* * 1010

включая объединенный шаг.

но это безобразно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...