如何在Pig中加载特定范围的输入文件

时间:2014-09-01 08:31:49

标签: java hadoop apache-pig glob

我有一组要使用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(' ');";

然而,这个解决方案有两个问题。

  1. x> 9 列车0到9未加载因为glob匹配数字00,01和02而不是单个数字版本0,1和2.我没有看到任何支持然而,在Hadoop globs中匹配第一个[0 - “+ tens +”]部分零次或一次(与正则表达式中的?匹配)。
  2. 当single为小于9的任何值时,对于低于10的所有值,数据文件也仅加载到此值。让我们说x = 24,比上面的代码只加载10-14,但不是15-19。我没有在Hadoop glob文档中看到任何内容,但是在第一个匹配的didit上使第二个匹配的数字依赖。
  3. 有没有人知道将我的数据文件范围加载到 x 的任何值的任何通用解决方案?我不知道我是否在使用glob的正确轨道,所以任何其他非glob解决方案也将非常受欢迎。

    非常感谢提前!

1 个答案:

答案 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(' ');";

希望这有帮助。