我有一组输入文件要使用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。我将pig脚本动态构建为java字符串,然后将其提交到集群。我正在寻找一个通用的解决方案来加载范围从0到一些数字x的train文件,在这里我可以将这个x设置为任何java int到99。
在我的解决方案的前一个版本中,支持x到9的值,我以以下方式使用了对globs的pig支持:
pigString += "TRAIN = LOAD 'user/hdp/input/custom/Fold1/train[0-"+x+"].txt' USING PigStorage(' ');";
这种方法不会缩放到大于9的值,因为从10开始,它开始占用两个字符而不是一个字符。一个可能的解决方案是将x拆分为一个数字,并使用它来构建pig字符串。
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>9时,由于glob匹配的是数字00、01和02,而不是单个数字版本0、1和2,因此不加载列0到9。不过,我在hadoop globs中没有看到任何支持将第一个[0-“+tens+”]部分零或一次匹配(比如?在正则表达式中)。
当single是任何小于9的值时,对于所有小于10的值,数据文件也只加载到该值。假设x=24,比上面的代码只加载10-14,而不是15-19。我在hadoop glob文档中没有看到任何使第二个匹配的数字依赖于第一个匹配的didit的内容。
有没有人知道任何通用的解决方案,可以将我的数据文件范围加载到x的任何值?我不知道我是否在正确的轨道上使用glob的,所以任何其他非glob的解决方案也将非常感谢。
非常感谢!
1条答案
按热度按时间qvtsj1bj1#
我看了hadoop glob签名,看起来应该比我们最初想的要容易。
创建一个逗号分隔的字符串,其中包含您感兴趣的所有数字,并将其称为expectednumber。e、 g.expectednumbers=“0,1,2,3,4,5”,然后按如下方式使用:
希望这有帮助。