正如我noted previously,Pig无法很好地处理空(0字节)文件。不幸的是,有很多方法可以创建这些文件(甚至within Hadoop utilitities)。
我认为通过使用LOAD statement显式加载Hadoop's glob syntax中与给定命名约定匹配的文件,我可以解决此问题。不幸的是,这似乎不起作用,因为即使我使用glob过滤到已知良好的输入文件,我仍然遇到0字节失败mentioned earlier。
这是一个例子:假设我在S3中有以下文件:
如果我在我的猪脚本中使用这样的LOAD语句:
myData = load 's3://mybucket/a/b/*.log as ( ... )
我希望Pig不会阻塞0字节文件,但它仍然会。是否有一个技巧让Pig实际上只查看符合预期的glob模式的文件?
答案 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最终会抛出异常“无法创建输入切片”。