我有一组要使用Pig处理的输入文件,具有以下命名结构:
/user/hdp/input/custom/Fold1/train0.txt
/user/hdp/input/custom/Fold1/train1.txt
/user/hdp/input/custom/Fold1/train2.txt
/user/hdp/input/custom/Fold1/train3.txt
...
/user/hdp/input/custom/Fold1/train9.txt
/user/hdp/input/custom/Fold1/train10.txt
/user/hdp/input/custom/Fold1/train11.txt
/user/hdp/input/custom/Fold1/train12.txt
...
直到培训文件99.我将Java脚本动态地构建为Java字符串,然后将其提交到我的集群。我正在寻找一个通用的解决方案来加载从 0 到一些 x 的列车文件范围,我可以将 x 设置为任何java int到99.
在我的解决方案的先前版本中,支持 x 的值高达9,我使用Pig支持以下列方式:
pigString += "TRAIN = LOAD 'user/hdp/input/custom/Fold1/train[0-"+x+"].txt' USING PigStorage(' ');";
这种方法不能扩展到大于9的值,因为它从10开始占用两个字符而不是一个字符。一个可能的解决方案是将 x 拆分为单个数字,并使用它来构建猪字符串。
int tens = x/10;
int single = x%10;
if(tens>0)
pigString += "TRAIN = LOAD 'user/hdp/input/custom/Fold1/train[0-"+tens+"][0-+"single"+.txt' USING PigStorage(' ');";
else
pigString += "TRAIN = LOAD 'user/hdp/input/custom/Fold1/train[0-"+single+"].txt' USING PigStorage(' ');";
然而,这个解决方案有两个问题。
有没有人知道将我的数据文件范围加载到 x 的任何值的任何通用解决方案?我不知道我是否在使用glob的正确轨道,所以任何其他非glob解决方案也将非常受欢迎。
非常感谢提前!
答案 0 :(得分:1)
我查看了hadoop glob签名,看起来它应该比我们最初的想法更容易。
创建一个逗号分隔的字符串,其中包含您感兴趣的所有数字,并将其命名为expectedNumber。例如expectedNumbers =“0,1,2,3,4,5”然后使用如下:
pigString += "TRAIN = LOAD 'user/hdp/input/custom/Fold1/train" + {expectedNumbers} +".txt' USING PigStorage(' ');";
希望这有帮助。