我有一组输入文件要使用 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 的火车文件范围,我可以将这个 x 设置为任何不超过 99 的 java int。
在我的解决方案的先前版本中,支持的 x 值最多为 9,我通过以下方式使用 Pig 对 glob 的支持:
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 列车 0 到 9 未加载时,因为 glob 匹配数字 00、01 和 02,而不是单个数字版本 0、1 和 2。我没有看到任何支持然而,在 Hadoop glob 中用于匹配第一个 [0-"+tens+"] 部分零次或一次(就像在正则表达式中使用 ?)。
- 当 single 是任何小于 9 的值时,对于所有小于 tens 的值,数据文件也只加载到该值。比方说 x = 24,比上面的代码只加载 10-14,而不是 15-19。我没有在 Hadoop glob 文档中看到任何内容,但是使第二个匹配的数字依赖于第一个匹配的 didit。
有谁知道任何通用解决方案可以将我的数据文件范围加载到 x 的任意值?我不知道我是否在使用 glob 的正确轨道上,所以任何其他非 glob 解决方案也将不胜感激。
非常感谢!
最佳答案
我看了hadoop glob签名,看起来应该比我们最初想象的要容易。
创建一个由您感兴趣的所有数字组成的逗号分隔字符串,并将其命名为 expectedNumber。例如expectedNumbers = "0,1,2,3,4,5"然后按如下方式使用它:
pigString += "TRAIN = LOAD 'user/hdp/input/custom/Fold1/train" + {expectedNumbers} +".txt' USING PigStorage(' ');";
希望这对您有所帮助。
关于java - 如何在 Pig 中加载特定范围的输入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25601779/