我有一个每天创建的文件夹,它们都存储相同类型的信息.我想创建一个脚本,加载最新的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);
Run Code Online (Sandbox Code Playgroud)
这不是我能够开箱即用的东西,并且可以通过某种包装脚本或帮助脚本(bash,perl等)在脚本之外完成.如果你编写了一个名为的脚本,last10.sh它将输出你最后10个文件,逗号分隔:
$ ./last10.sh
/input/file38,/input/file39,...,/input/file48
Run Code Online (Sandbox Code Playgroud)
像这样的东西应该可以解决最近10个文件:
hadoop fs -ls /input/ | sort -k6,7 | tail -n10 | awk '{print $8}' | tr '\n' ','
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
$ pig -p files="`last10.sh`" my_mr.pig
Run Code Online (Sandbox Code Playgroud)
然后,在您的猪脚本中,执行:
data = LOAD '$files'
USING com.twitter.elephantbird.pig.load.LzoTokenizedLoader('\\t')
AS (i1, i2, i3);
Run Code Online (Sandbox Code Playgroud)
如果它们以逗号分隔,那么Pig会加载单独的文件.这相当于:
data = LOAD '/input/file38,/input/file39,...,/input/file48'
USING com.twitter.elephantbird.pig.load.LzoTokenizedLoader('\\t')
AS (i1, i2, i3);
Run Code Online (Sandbox Code Playgroud)
Donald Miner 的答案仍然非常有效,但 IMO 现在有一个更好的方法,使用Python 中的Embedded Pig。O'Reilly在这里做了一个简单的解释。这里还有一个关于为什么这是您想要做的事情以及它如何工作的演示。长话短说,在运行 Pig 脚本以确定脚本的各个部分之前,最好能够访问很多功能。通过在 Jython 中包装和/或动态生成脚本的各个部分,您可以做到这一点。麾!