2011-04-21 57 views
8

正如我noted previously,猪不空(0字节)文件以及应付。不幸的是,有很多这些文件,可以生成方式(甚至within Hadoop utilitities)。Pig如何在'load'语句中使用Hadoop Globs?

我认为我可以通过使用Hadoop's glob syntax明确加载仅匹配LOAD statement中给定命名约定的文件来解决此问题。不幸的是,这似乎并没有工作,因为即使当我使用水珠往下筛选到已知良好的输入文件,我仍然会碰到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 (...) 

我预计猪不会对0字节的文件呛,但它仍然没有。让Pig实际上只查看与期望的glob模式相匹配的文件有什么窍门吗?

回答

3

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

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

hadoop fs -lsr s3://mybucket/a 

其中返回文件列表以及其他元数据。然后,我们可以从数据创建的水珠:

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

这需要多一点的前端工作,但使我们能够专门针对我们所感兴趣的文件,避免0字节的文件。

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