2011-04-21 17 views
8

noted previously yüklediğim gibi, Pig boş (0 bayt) dosyalarla iyi başa çıkmıyor. Ne yazık ki, bu dosyaların oluşturulmasının birçok yolu vardır (hatta within Hadoop utilitities).Pig, Hadoop Globs'u bir 'load' ifadesinde nasıl kullanıyor?

Bu soruna geçici olarak, LOAD statement numaralı Hadoop's glob syntax'u kullanarak belirli bir adlandırma kuralıyla eşleşen dosyaları açıkça yükleyerek çalışabileceğimi düşündüm. Ne yazık ki, bu, iyi bilinen giriş dosyalarına filtre uygulamak için bir glob kullandığım zaman bile, mentioned earlier 0-bayt hatasıyla karşılaştığım gibi işe yaramıyor. İşte

bir örnek:

  • mybucket/a/b/(0 bayt)
  • mybucket/a/b/myfile.log (> 0 bayt): Ben S3 aşağıdaki dosyaları var varsayalım
  • mybucket/a/b/yourfile.log (> 0 bayt)

benim domuz komut böyle bir YÜK deyimi kullanıyorsanız:

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

Pig'ın 0 baytlık dosyada boğulmayacağını umuyorum ama yine de öyle. Pig'a aslında beklenen glob modeline uyan dosyalara bakmak için bir numara var mı?

cevap

3

Bu oldukça çirkin bir çözümdür, ancak * joker karakter sözlüğüne güvenmeyen globs işe yarıyor gibi görünmektedir. Dolayısıyla, iş akışımızda (bizim domuz betiğimizi çağırmadan önce), ilgilendiğimiz önek altındaki tüm dosyaları listeleriz ve sonra yalnızca ilgilendiğimiz yollardan oluşan belirli bir küre oluştururuz.

örnek yukarıdaki örnekte, biz "mybucket/a" listesi:

bir dosyaların listesini, artı diğer döner meta
hadoop fs -lsr s3://mybucket/a 

. Daha sonra bu verilerden topak oluşturabilirsiniz:

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

Bu biraz daha ön uç çalışma gerektirir, ancak özellikle biz ilgilendiğiniz dosyaları hedef ve 0 bayt dosyaları önlemek için bize izin verir.

Güncelleme: Maalesef, glob kalıbı uzadığında bu çözümün başarısız olduğunu buldum; Domuz, "Giriş dilimi oluşturulamıyor" özel bir durum atıyor.