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

时间:2011-09-07 20:38:48

标签: apache-pig

我每天都会创建一个文件夹,它们都存储相同类型的信息。我想创建一个脚本,加载最新的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);

3 个答案:

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