看似简单,我可以用另一种语言轻松做到这一点,但我很难找到使用Pig的答案。我可以每天将一个或多个日志文件转储到目录。我想迭代地调用每个文件并将其传递给Pig脚本进行处理。我知道参数替换,但我如何遍历文件并传递/调用我的Pig脚本?谢谢。
答案 0 :(得分:3)
您可以直接在Pig中使用通配符:
a= load '/user/hadoop/test/*.csv' using PigStorage(',');
dump a;
如果您的文件存储在本地驱动器上,则需要先将它们上传到HDFS:
hadoop fs -put /localdir/*.csv /user/hadoop/test
如果你必须在Pig中获取文件列表,你可以创建一个bash来初始化这个列表并调用pig命令。例如,如果您要使用名为" httpd-.log"的 5个最新文件启动您的猪脚本,请创建 .sh :
#!/bin/bash
set -e
HDFS_PATH=/user/hadoop/test
FILES=`hadoop fs -ls $HDFS_PATH | grep "httpd" | sort +5 -7 | tail -5 | awk '{ print $8 }'| tr '\n' ','`
pig -f <pig_script> -p files=$FILES
并在你的猪脚本中:
a= load '$files' using PigStorage(',');
罗曼
答案 1 :(得分:1)
我不确定是否可以直接用猪做,但我通常使用hadoop和awk的组合来做到这一点
hadoop fs -ls /testing/*.data | awk '{print $8}' | xargs -I {} pig -param input={} test.pig
在上面的例子中,假设你必须处理hdfs中测试文件夹下的所有.data文件(如果你想要所有类型,那么只需要一个*)你做一个列表,然后grep只有文件pat部分和然后使用xargs将它传递给你的猪文件你的猪文件应该使用输入作为参数
Pig文件应该有这样的东西
a= load '$input' using PigStorage(',');
dump a;
答案 2 :(得分:0)
我只是阅读了整个目录,并没有尝试处理单个文件。
a= load '/user/Hadoop/test/' using PigStorage(',');
您将获得与所有CSV文件内容的单一关系。