Pig如何在“加载”语句中使用Hadoop Globs?

时间:2011-04-21 23:05:23

标签: hadoop apache-pig

正如我noted previously,Pig无法很好地处理空(0字节)文件。不幸的是,有很多方法可以创建这些文件(甚至within Hadoop utilitities)。

我认为通过使用LOAD statement显式加载Hadoop's glob syntax中与给定命名约定匹配的文件,我可以解决此问题。不幸的是,这似乎不起作用,因为即使我使用glob过滤到已知良好的输入文件,我仍然遇到0字节失败mentioned earlier

这是一个例子:假设我在S3中有以下文件:

  • mybucket / a / b /(0字节)
  • mybucket / a / b / myfile.log(> 0字节)
  • mybucket / a / b / yourfile.log(> 0字节)

如果我在我的猪脚本中使用这样的LOAD语句:

myData = load 's3://mybucket/a/b/*.log as ( ... )

我希望Pig不会阻塞0字节文件,但它仍然会。是否有一个技巧让Pig实际上只查看符合预期的glob模式的文件?

1 个答案:

答案 0 :(得分:3)

这是一个相当丑陋的解决方案,但不依赖于*通配符语法的globs似乎有效。因此,在我们的工作流程中(在调用我们的猪脚本之前),我们列出了我们感兴趣的前缀下面的所有文件,然后创建一个特定的glob,它只包含我们感兴趣的路径。

例如,在上面的例子中,我们列出了“mybucket / a”:

hadoop fs -lsr s3://mybucket/a

返回文件列表以及其他元数据。然后我们可以从该数据创建glob:

myData = load 's3://mybucket/a/b{/myfile.log,/yourfile.log}' as ( ... )

这需要更多的前端工作,但允许我们专门定位我们感兴趣的文件并避免使用0字节文件。

更新:不幸的是,我发现当glob模式变长时,这个解决方案会失败; Pig最终会抛出异常“无法创建输入切片”。