2011-04-21 51 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模式變長;豬最終拋出一個異常「無法創建輸入切片」。