Apache pig 带oozie工作流的Pig

Apache pig 带oozie工作流的Pig,apache-pig,oozie,Apache Pig,Oozie,我有一个包装器shell脚本,它读取输入文件并多次调用pig脚本。这在crontab上运行良好。但是,在尝试使用oozie引擎时,它不起作用。如何在oozie中实现循环。如果这不是正确的方法,有人能建议其他方法吗?我需要能够从输入文件中读取一些参数,然后对每一行(以及相应的读取参数)多次调用pig脚本或pig操作 读行时 do seedidprefix=$(echo $line |awk -v OFS='\t' '{print $3;}') seedaudprefix=$(ec

我有一个包装器shell脚本,它读取输入文件并多次调用pig脚本。这在crontab上运行良好。但是,在尝试使用oozie引擎时,它不起作用。如何在oozie中实现循环。如果这不是正确的方法,有人能建议其他方法吗?我需要能够从输入文件中读取一些参数,然后对每一行(以及相应的读取参数)多次调用pig脚本或pig操作


读行时

do
    seedidprefix=$(echo $line |awk -v OFS='\t' '{print $3;}')
    seedaudprefix=$(echo $line |awk -v OFS='\t' '{print $2;}')
    adgrpid=$(echo $line |awk -v OFS='\t' '{print $1;}')
    nwtype=$(echo $line |awk -v OFS='\t' '{print $4;}')
    chainedseedid=$(echo $line |awk -v OFS='\t' '{print $5;}')

if [ $nwtype == "ADX" ]; then

    hadoop jar pig.jar -param segid=${seedaudprefix} -param nw=${nwtype} -param date=${MODELDATE} -param seedid=${seedidprefix} -param audienceId=${adgrpid} -param chainedseedid=${chainedseedid} ${TOP_DIR}/histo_bkup_adx.pig

else

    hadoop jar pig.jar -param segid=${seedaudprefix} -param nw=${nwtype} -param date=${MODELDATE} -param seedid=${seedidprefix} -param audienceId=${adgrpid} -param chainedseedid=${chainedseedid} ${TOP_DIR}/histo_bkup.pig

fi

done<${campaign_file}
do
seedidprefix=$(echo$行| awk-v OFS='\t'{print$3;}')
seedaudprefix=$(echo$行| awk-v OFS='\t'{print$2;}')
adgrpid=$(echo$行| awk-v OFS='\t'{print$1;}')
nwtype=$(echo$line | awk-v OFS='\t'{print$4;}')
chainedseedid=$(echo$行| awk-v OFS='\t'{print$5;}')
如果[$nwtype==“ADX”];然后
hadoop jar pig.jar-param segid=${seedaudprefix}-param nw=${nwtype}-param date=${MODELDATE}-param seedid=${seedPrefix}-param audenceId=${adgrpid}-param chainedseedid=${chainedseedid}${TOP\u DIR}/histo bkup\u adx.pig
其他的
hadoop jar pig.jar-param segid=${seedaudprefix}-param nw=${nwtype}-param date=${MODELDATE}-param seedid=${seedPrefix}-param audenceId=${adgrpid}-param chainedseedid=${chainedseedid}${TOP_DIR}/histo bkup.pig
fi

done我遇到了一个类似的问题——我需要执行一个pig脚本,执行的次数是可变的

对我来说,最有效的方法是在Python中使用嵌入式Pig([参见doc.][1])

Oozie工作流有一个pig操作,脚本指向python文件。 还可以使用file标记标记需要重复执行的pig脚本,以便将其加载到工作目录(控制器(在您的示例中为shell脚本)读取输入的文件也是如此)

Oozie脚本看起来像

<workflow>
    ...        
    <action name="action_1" retry-max="0" retry-interval="1">
        <pig>        
            <script>${path_src}/my_controller.py</script>
            <file>${path_src}/data.txt#data.txt</file>
            <file>${path_src}/my_script.pig#my_script.py</file>
        </pig>
        <ok to="Done"/>
        <error to="Fail"/>
    </action>
    ...
</workflow>
#!/usr/bin/python
from org.apache.pig.scripting import Pig
if __name__ == '__main__' :
    # Load pig parameters - assuming each parameter is in the format KEY = Value
    pigParams = {}
    ipFile = open( 'data.txt', 'r' )
    for line in ipFile :
        if len( line.strip() ) == 0 :
            continue
        fields = line.split( '=' )
        pigParams[ fields[ 0 ].strip() ] = fields[ 1 ].strip()
    ipFile.close()

    for i in range( 10 ) :
        pigScript = Pig.compileFromFile( 'my_script.pig' )
        pigScript.bind( pigParams ).run()

希望这能有所帮助。

为什么要循环?你能举个例子吗?