【问题标题】:How to load a specific range of input files in Pig如何在 Pig 中加载特定范围的输入文件
【发布时间】:2014-09-01 08:31:48
【问题描述】:

我有一组输入文件要使用 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 设置为任何 java int 最多 99。

在我的解决方案的先前版本中,支持的 x 值最多为 9,我通过以下方式使用 Pig 对 glob 的支持:

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 glob 中,用于匹配第一个 [0-"+tens+"] 部分零次或一次(如正则表达式中的 ?)。
  2. 当 single 是任何小于 9 的值时,对于所有小于 10 的值,数据文件也只会加载到该值。假设 x = 24,而不是上面的代码只加载 10-14,而不是 15-19。我在 Hadoop glob 文档中没有看到任何内容,但是要使第二个匹配的数字依赖于第一个匹配的 didit。

有没有人知道任何通用解决方案可以将我的数据文件范围加载到 x 的任何值?我不知道我是否在使用 glob 的正确轨道上,所以任何其他非 glob 解决方案也将不胜感激。

提前非常感谢!

【问题讨论】:

  • 如果你在JAVA中形成pigString,为什么不使用x.toString()形成如下文件名:"/user/hdp/input/custom/Fold1/train" + x +“.txt”?用从 0 到 x 的 for 循环包围它。
  • 因为那样我会有 x 个加载语句,每个加载一个火车文件,而我需要 1 个加载语句,一次加载 x 个火车文件
  • 哦,知道了。我认为您正在努力为 2 位数字(包括 0 到 9)创建正则表达式。这有帮助吗:regular-expressions.info/numericranges.html?
  • 是的,该文档描述了我遇到的完全相同的问题,但针对的是正则表达式。但是,我不太确定 Pig 在加载文件的情况下是否支持正则表达式(在 Pig 中使用正则表达式的唯一参考是在过滤函数的情况下:chimera.labs.oreilly.com/books/1234000001811/ch05.html#filter)。 Pig 支持简单的 globbing,但我不确定是否可以纯粹通过 globbing 解决这个问题。
  • 知道了。我看不到使用 glob 创建复杂正则表达式的方法。顺便说一句,感谢您用代码示例编写了这个简洁的问题。

标签: java hadoop apache-pig glob


【解决方案1】:

我查看了 hadoop glob 签名,看起来它应该比我们最初想象的要容易。

为您感兴趣的所有数字创建一个逗号分隔的字符串,并将其命名为 expectedNumber。例如expectedNumbers = "0,1,2,3,4,5" 然后使用如下:

pigString += "TRAIN = LOAD 'user/hdp/input/custom/Fold1/train" + {expectedNumbers} +".txt' USING PigStorage(' ');";

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 2014-01-18
    相关资源
    最近更新 更多