2017-11-06 14 views
0

CSVファイルを読み込んで解析する際に問題が発生しています。いくつかのレコードには改行記号があり、\でエスケープされ、そのレコードは引用符で囲まれていません。私はsc.textFile("file.csv")を使用してsqlContext.read.format("..databricks..").option("escape/delimiter/...").load("file.csv")改行文字でファイルを解析する方法でエスケープされ、引用符で囲まれていない

を使用して、それを読むことを試みた

Line1field1;Line1field2.1 \ 
Line1field2.2;Line1field3; 
Line2FIeld1;Line2field2;Line2field3; 

しかし、私はそれを読んでどのように重要ではありません、記録/ライン/行が作成されたときに ":ファイルは、次のようになります。 \ \ n "に達しました。だから、代わりに前のファイルから2つのレコードを有するので、私は3を取得しています:

[Line1field1,Line1field2.1,null] (3 fields) 
[Line1field.2,Line1field3,null] (3 fields) 
[Line2FIeld1,Line2field2,Line2field3;] (3 fields) 

期待される結果は次のとおりです。

[Line1field1,Line1field2.1 Line1field.2,Line1field3] (3 fields) 
[Line2FIeld1,Line2field2,Line2field3] (3 fields) 

(改行記号がレコードに保存されているどのようにそれは重要ではありません、主な問題は、レコード/行の正しいセットを持っている)

これを行う方法のアイデア?元のファイルを変更せずに、好ましくはポスト/再処理なしで(例えば、ファイルを読み込んで、予想よりもフィールド数が少ないラインをフィルタリングし、それらを連結することは解決策になる可能性がありますが、最適ではありません)

私の希望は、databrickのcsvパーサーを使用してエスケープ文字を\(デフォルトであるはずです)に設定することでしたが、これはうまくいかなかった[ java.io.IOException: EOF whilst processing escape sequenceというエラーが出ました。

私は何とかパーサーを拡張して何かを編集して、自分のパーサを作成する必要がありますか?どのソリューションが最適でしょうか?

ありがとうございます!

EDIT:言及するのを忘れ、私は1.6

答えて

0

wholeTextFiles APIは、あなたのケースでは救助者のAPIである必要があり、スパークを使用しています。ファイルをキー、値のペアとして読み込みます。キーはファイルのパス、値はファイルのテキスト全体です。あなたは

val rdd = sparkSession.sparkContext.wholeTextFiles("path to the file") 
       .flatMap(x => x._2.replace("\\\n", "").replace(";\n", "\n").split("\n")) 
       .map(x => x.split(";")) 

rdd出力は

[Line1field1,Line1field2.1 Line1field2.2,Line1field3] 
[Line2FIeld1,Line2field2,Line2field3] 
+0

おかげですが、所望の出力を得るために、いくつかの代替と分裂を行う必要があります!完璧に動作します:) – perico

+0

私の喜び@perico、あなたが適格になったときupvoteを忘れないでください:) –

関連する問題