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

标签 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。我将我的 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(' ');";

但是这个解决方案有两个问题。

  1. x>9 列车 0 到 9 未加载时,因为 glob 匹配数字 00、01 和 02,而不是单个数字版本 0、1 和 2。我没有看到任何支持然而,在 Hadoop glob 中用于匹配第一个 [0-"+tens+"] 部分零次或一次(就像在正则表达式中使用 ?)。
  2. 当 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/

相关文章:

json - 用大象鸟加载后如何查询嵌套的json

java - 局部变量可以和全局变量重名吗?

hadoop - 使用 SquirrelSQL 客户端连接到 Hive 服务器

apache-pig - 检查包中是否存在元素?

hadoop - 我们可以在 hadoop 的 reduce 函数中使用一个文件吗?

hadoop - 为什么hadoop对reducer的输入进行排序?

hadoop - 如何转储数据?

java - 确定哪个方法触发了一个方面

java - 电子邮件发送代码不适用于 ubuntu

Java List.add() 方法添加一个可修改的对象