8

正如我之前提到的,Pig 不能很好地处理空(0 字节)文件。不幸的是,有很多方法可以创建这些文件(甚至在 Hadoop 实用程序中)。

我认为我可以通过使用Hadoop 的 glob 语法在LOAD 语句中显式加载与给定命名约定匹配的文件来解决这个问题。不幸的是,这似乎不起作用,因为即使我使用 glob 过滤到已知良好的输入文件,我仍然遇到前面提到的 0 字节故障。

这是一个示例:假设我在 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 模式匹配的文件是否有技巧?

4

1 回答 1

3

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

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

hadoop fs -lsr s3://mybucket/a

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

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

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

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

于 2011-04-22T15:17:30.783 回答