我每天都会创建一个文件夹,它们都存储相同类型的信息。我想创建一个脚本,加载最新的10个,UNIONs,然后运行其他代码。由于pig已经有了ls方法,我想知道是否有一种简单的方法让我获取最后10个创建的文件,并使用相同的加载器和选项将它们全部加载到通用名称下。我猜它看起来像是:
REGISTER /usr/local/lib/hadoop/hadoop-lzo-0.4.13.jar;
REGISTER /usr/local/lib/hadoop/elephant-bird-2.0.5.jar;
FOREACH file in some_path:
file = LOAD 'file'
USING com.twitter.elephantbird.pig.load.LzoTokenizedLoader('\\t')
AS (i1, i2, i3);
答案 0 :(得分:7)
这不是我能够开箱即用的东西,并且可以通过某种包装脚本或帮助脚本(bash,perl等)在脚本之外完成。如果您编写一个名为last10.sh
的脚本,它将输出您最后10个文件,逗号分隔:
$ ./last10.sh
/input/file38,/input/file39,...,/input/file48
这样的事情应该可以解决最近的10个文件:
hadoop fs -ls /input/ | sort -k6,7 | tail -n10 | awk '{print $8}' | tr '\n' ','
你可以这样做:
$ pig -p files="`last10.sh`" my_mr.pig
然后,在您的猪脚本中,执行:
data = LOAD '$files'
USING com.twitter.elephantbird.pig.load.LzoTokenizedLoader('\\t')
AS (i1, i2, i3);
如果它们以逗号分隔,那么Pig会加载单独的文件。这相当于:
data = LOAD '/input/file38,/input/file39,...,/input/file48'
USING com.twitter.elephantbird.pig.load.LzoTokenizedLoader('\\t')
AS (i1, i2, i3);
答案 1 :(得分:2)
Donald Miner的回答仍然完美无缺,但IMO现在使用Python中的 Embedded Pig 有更好的方法。 O'Reilly有一个简短的解释here。还有一个演示文稿说明为什么这是你想做的事情,以及它是如何运作的here。简而言之,在运行pig脚本以确定脚本部分之前,有很多功能可以访问。在Jython中包装和/或动态生成脚本的一部分让你这样做。飘柔!
答案 2 :(得分:1)
我喜欢上述两种方法。只是想为oozie爱好者提供一个选择。 oozie中的Java操作会在“oozie.action.output.properties”配置的位置吐出文件,而Pig操作会将其传递给pig脚本。与上面的2相比,这绝对不是优雅的解决方案。我在oozie中使用java schedule配置嵌入式猪时遇到了麻烦,所以我不得不使用这个解决方案。
<workflow-app xmlns='uri:oozie:workflow:0.1' name='java-wf'>
<start to='java1' />
<action name='java1'>
<java>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<main-class>org.apache.oozie.test.MyTest</main-class>
<arg>${outputFileName}</arg>
<capture-output/>
</java>
<ok to="pig1" />
<error to="fail" />
</action>
<action name='pig1'>
<pig>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<script>script.pig</script>
<param>MY_VAR=${wf:actionData('java1')['PASS_ME']}</param>
</pig>
<ok to="end" />
<error to="fail" />
</action>
<kill name="fail">
<message>Pig failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name='end' />