2016-05-19 5 views
0

私が持っている:S3上のファイルのApache Sparkで異なる列数の独自のヘッダーを持つファイルを処理するにはどうすればよいですか?

  1. 何百万
  2. 形式が、それは特別な治療を必要とするひどいDSV仕様であるため、ヘッダ行は、特殊文字で始まり、各ファイルが複数のヘッダを含めることができますhttps://github.com/databricks/spark-csvと互換性がありません
  3. 各ファイルにヘッダーがありますが、ヘッダーが変更されています(異なるフィールド/列)。このファイルには、パフォーマンス上の理由から
  4. 私はsmthを行う必要があります。 read.text("s3n://2016/01/*")

ヘッダーを取得する方法とそれに対応する行を一緒に処理する方法が見つかりません。 ImhoのカスタムPartitionerは、ファイルごとのデータを分割することはできませんし、rdd/dataset/dataframe APIはこれを行う手段を提供していません...

ご存じですか?私はSpark 2.0.0を使うことができます。 Sparkはヘッダー付きのDSVファイルにはあま​​り親切ではないようですが、特にヘッダーが異なる場合は...

+0

パフォーマンス上の理由から、あなたは絶対に 'read.text(" s3n:// 2016/01/* ")'をしたくありません。 http://tech.kinja.com/how-not-to-pull-from-s3-using-apache-spark-1704509219を参照してください。 – Marcin

+0

いずれにしても、ファイル形式の詳細を教えてください。最も一般的な方法は、独自のリーダーを実装することです。 – Marcin

答えて

0

おそらく最も単純な戦略は、ファイルを整理して後で処理するか、ビルドアップすることですどのファイルがどのタイプのディレクトリであるかを確認し、それを使ってRDDを構築する。

amdd s3クライアントをrddから呼び出す例については、http://tech.kinja.com/how-not-to-pull-from-s3-using-apache-spark-1704509219を参照してください。あなたはそのディレクトリを構築するためにそれを使うことができます。

+0

ちょっと、kinja.comの記事を読んで、一度マシンを追加すると間違いなくそれをやるでしょう。私は書式の説明を更新しました。私はパーティションで動作する 'spark-csv'のコードを"コピー/ペースト "し、それぞれが一つのファイルを表すパーティションを繰り返すことができると考えています。 – lisak

+0

もう一つ質問があります。ファイル?だから私は確実に1つのファイルあたり1つのパーティションを得るだろうか?カスタムのDataSourceを実装する代わりに? – lisak

+0

'spark-csv'ライブラリは' sc.textFile(...) 'だけを使用していて、' rdd.mapPartitions {lines => lines.head; ...} 'これは必ずしもファイルごとに1つのパーティションに解決する必要はありません。 – lisak

関連する問題