Apache pig 如何使用PIG加载文件夹中的每个文件?

Apache pig 如何使用PIG加载文件夹中的每个文件?,apache-pig,Apache Pig,我有一个每天创建的文件文件夹,所有这些文件都存储相同类型的信息。我想制作一个脚本,加载其中最新的10个,合并它们,然后在它们上运行一些其他代码。由于pig已经有了一个ls方法,我想知道是否有一种简单的方法可以让我获得最后10个创建的文件,并使用相同的加载程序和选项以通用名称加载它们。我猜它看起来会像: REGISTER /usr/local/lib/hadoop/hadoop-lzo-0.4.13.jar; REGISTER /usr/local/lib/hadoop/elephant-bird

我有一个每天创建的文件文件夹,所有这些文件都存储相同类型的信息。我想制作一个脚本,加载其中最新的10个,合并它们,然后在它们上运行一些其他代码。由于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);

这不是我能够立即完成的事情,而是可以在脚本之外使用某种包装脚本或帮助脚本(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
然后,在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);

Donald Miner的答案仍然非常有效,但在我看来,在Python中使用嵌入式Pig有一种更好的方法。奥莱利有一个简短的解释。还有一个关于为什么你想做这件事的演示,以及它是如何工作的。长话短说,在运行pig脚本来确定脚本的各个部分之前,有很多功能是很好的。让我们在Jython中包装和/或动态生成脚本的部分。高兴吧

我喜欢以上两种方法。只是想给oozie爱好者多一个选择。oozie中的Java操作在“oozie.action.output.properties”配置的位置吐出一个文件,Pig操作将其传递给Pig脚本。与上述2相比,这绝对不是一个优雅的解决方案。我在oozie中使用java schedule配置嵌入式pig时遇到了问题,所以我不得不使用这个解决方案

<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' />

${jobTracker}
${nameNode}
mapred.job.queue.name
${queueName}
org.apache.oozie.test.MyTest
${outputFileName}
${jobTracker}
${nameNode}
mapred.job.queue.name
${queueName}
猪
MY_VAR=${wf:actionData('java1')['PASS_ME']}
Pig失败,错误消息[${wf:errorMessage(wf:lastErrorNode())}]

太好了!如果PIG能给我一个直接做的方法会更好,但这确实有效。谢谢我同意。Pig很擅长做分析工作,但当涉及到分析之外的任何类型的真正集成时,它没有太多。我的团队已经承认我们所有的猪脚本都需要用bash.Nevermind包起来。事实证明pig不喜欢空格,因此类似于pig-p files=“file1 file2”script.pig的东西不起作用,并因“在命令行上遇到意外参数”错误而终止。你有解决办法吗?哎呀!我的错!它喜欢逗号,而不是空格。我正在更新我的答案,用逗号替换换行符。让我知道这是否有效。我知道有些人在路径上使用
{
}
,比如
{file1,file2,file3}
,但我认为他们有同样的效果。酷!我唯一的建议是,在awk的末尾再添加一个管道,以消除在开头和结尾产生的括号。这将是您在上面的答案,并添加:|awk'{print substr($0,1,length($0)-1)}'