2011-12-19 2 views
2

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

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

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

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

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 

Вызов `сделать присоединился к» успешно производит «присоединился «файл, который мне нужен, но он каждый раз перестраивает каждый файл, несмотря на отсутствие изменений в файлах зависимостей.

Я попытался использовать имена выходных файлов в качестве целей, но 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 шагов в целом, а управление зависимостями самостоятельно через файлы сценариев становится слишком сложным.

+0

«GNU Make, похоже, не знает, как справиться»? Не могли бы вы быть более ясными, рассказать нам, что пошло не так? – Beta

ответ

2

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

Либо фиксирующих цели и его зависимости с чем-то вроде:

JOINED=${DATA}/processed/joined 

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

или шагов, которые вы можете закончить каждый шаг с

touch [email protected] 

например:

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 && touch [email protected] || $(RM) [email protected] 

включая присоединенный шаг.

, но это уродливо.

+1

Я принял ваше первое предложение и сохранил некоторую простоту использования, создав такую ​​цель: JOINED: $ (JOINED) –

Смежные вопросы