2017-02-26 7 views
0

私はScalaを使ってSparkを開発していますが、私はScalaの背景を持っていません。私はまだValueErrorを取得していませんが、自分のコードに対してValueErrorハンドラを準備しています。Dataframeの使用からValueErrorを処理する方法Scala

|location|arrDate|deptDate| 
|JFK  |1201 |1209 | 
|LAX  |1208 |1212 | 
|NYC  |  |1209 | 
|22  |1201 |1209 | 
|SFO  |1202 |1209 | 

私たちは、このようなデータを持っている場合、私はその後、Error.datに第三行と第四行を保存し、再び5番目の行を処理したいと思います。エラーログには、どのファイル、行番号、エラーの詳細などの情報を記述したいと思います。ロガーについては、私は現在log4jを使用しています。

この機能を実装する最善の方法は何ですか?みんな助けてくれますか?

+0

空の場合4行目はエラーファイルに拒否されますか? –

+0

@ 3rd arrDateの@ rogue-oneは空であり、4行目の位置データはStringでなければなりません。これらは拒絶の条件です。 –

答えて

1

私はすべての3つの列が文字列型であると仮定しています。その場合、私は以下のスニペットを使用してこれを解決します。私はエラーレコードを確認するために2つのudfを作成しました。

  • フィールドは、[isNumber]
  • 数字だけを持っている場合、文字列フィールドには、どのような条件3'rdの[isEmpty]

コードスニペット

import org.apache.spark.sql.functions.row_number 
import org.apache.spark.sql.expressions.Window 
import org.apache.spark.sql.functions.udf 

val df = rdd.zipWithIndex.map({case ((x,y,z),index) => (index+1,x,y,z)}).toDF("row_num", "c1", "c2", "c3") 
val isNumber = udf((x: String) => x.replaceAll("\\d","") == "") 
val isEmpty = udf((x: String) => x.trim.length==0) 
val errDF = df.filter(isNumber($"c1") || isEmpty($"c2")) 
val validDF = df.filter(!(isNumber($"c1") || isEmpty($"c2"))) 


scala> df.show() 
+-------+---+-----+-----+ 
|row_num| c1| c2| c3| 
+-------+---+-----+-----+ 
|  1|JFK| 1201| 1209| 
|  2|LAX| 1208| 1212| 
|  3|NYC|  | 1209| 
|  4| 22| 1201| 1209| 
|  5|SFO| 1202| 1209| 
+-------+---+-----+-----+ 

scala> errDF.show() 
+-------+---+----+----+ 
|row_num| c1| c2| c3| 
+-------+---+----+----+ 
|  3|NYC| |1209| 
|  4| 22|1201|1209| 
+-------+---+----+----+ 
+0

素晴らしい提案をありがとう。もう1つの質問は、空の列がある場合にすべての列をチェックしたい場合です。 –

+0

これは私がすべての列をチェックしたものです。 @BryanK。 –

+0

私はあなたのコメントを逃した。すべての列に同じudfを適用して、空の文字列を確認することができます。 –

関連する問題