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 バイト)

Pig スクリプトで次のような LOAD ステートメントを使用すると、次のようになります。

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

Pig が 0 バイトのファイルでチョークしないことを期待しますが、それでもチョークします。Pig に、予想される glob パターンに一致するファイルのみを実際に見てもらうためのトリックはありますか?

4

1 に答える 1

3

*これはかなり見苦しい解決策ですが、ワイルドカード構文に依存しないグロブは機能するようです。そのため、このワークフローでは (pig スクリプトを呼び出す前に)、関心のあるプレフィックスの下にすべてのファイルを一覧表示し、関心のあるパスのみで構成される特定の glob を作成します。

たとえば、上記の例では、「mybucket/a」をリストします。

hadoop fs -lsr s3://mybucket/a

ファイルのリストとその他のメタデータを返します。次に、そのデータからグロブを作成できます。

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

これにはもう少しフロントエンドの作業が必要ですが、関心のあるファイルを具体的にターゲットにして、0 バイトのファイルを避けることができます。

更新:残念ながら、glob パターンが長くなると、このソリューションは失敗することがわかりました。Pig は、「入力スライスを作成できません」という例外をスローしてしまいます。

于 2011-04-22T15:17:30.783 に答える