2016-05-12 14 views
1

私はCSVファイルを持っており、そのデータを処理しています。データフレームの空値/空値を処理する方法Spark/Scala

私は、データフレームに働いている、と私は平均、最小、最大、いくつかの条件に基づいて、各列の平均値、合計値を計算します。各列のデータは空でもnullでもかまいません。

私はいくつかのケースで私が最大値を得たことに気付きました、または数値ではなくヌル値を合計しました。あるいは、min()が返す出力よりも少ないmax()を取得しました。

null/emptyの値をotherに置き換えたくありません。私が行っている 唯一のことは、CSVでこれらの2つのオプションを使用することです:

.option("nullValue", "null") 
.option("treatEmptyValuesAsNulls", "true") 

を、この問題に対処する方法はありますか?誰もがこの問題に直面したことはありますか?それはデータ型の問題ですか?

私はこのような何かを実行します。そうでなければ、私はそれが私のコードに問題であることを考えることができ

data.agg(mean("col_name"), stddev("col_name"),count("col_name"), 
     min("col_name"), max("col_name")) 

を。

+0

これらの集約関数はNULL値を無視するので、NULL値の存在は問題ではありません。あなたはいくつかの条件に基づいてそれらを計算すると言った、多分問題はそこにある。また、これらの関数を数値列に適用していることを確認してください。必要に応じて '.cast(" double ")'を使うことができます。 –

答えて

0

コメントの1つに反して、それはではありません。 nullは無視されます。ここでのアプローチは、次のとおりです。

max(coalesce(col_name,Integer.MinValue)) 
min(coalesce(col_name,Integer.MaxValue)) 

のみ NULL値があった場合、これはまだ問題があります:あなたはNULLまたはものは何でも無/「有効なを表していないために使用するために最小/ MaxValueを変換する必要があります。 -null entries "となります。

0

私はこの質問についていくつかの研究を行いました。その結果、mean、max、min関数はnull値を無視しています。以下は実験コードと結果です。 環境:スカラ座、あなたはグループキー=「1」を返す「2.4」の列「価値」の平均値、最大値は、最小機能することを確認することができ、出力から1.6.1のHadoop 2.6.0

import org.apache.spark.sql.{Row} 
import org.apache.spark.sql.types.{DoubleType, IntegerType, StringType, StructField, StructType} 
import org.apache.spark.sql.types._ 
import org.apache.spark.{SparkConf, SparkContext} 

val row1 =Row("1", 2.4, "2016-12-21") 
val row2 = Row("1", None, "2016-12-22") 
val row3 = Row("2", None, "2016-12-23") 
val row4 = Row("2", None, "2016-12-23") 
val row5 = Row("3", 3.0, "2016-12-22") 
val row6 = Row("3", 2.0, "2016-12-22") 
val theRdd = sc.makeRDD(Array(row1, row2, row3, row4, row5, row6)) 

val schema = StructType(StructField("key", StringType, false) :: 
        StructField("value", DoubleType, true) :: 
        StructField("d", StringType, false) :: Nil) 
val df = sqlContext.createDataFrame(theRdd, schema) 

df.show() 

df.agg(mean($"value"), max($"value"), min($"value")).show() 

df.groupBy("key").agg(mean($"value"), max($"value"), min($"value")).show() 


Output: 
+---+-----+----------+ 
|key|value|   d| 
+---+-----+----------+ 
| 1| 2.4|2016-12-21| 
| 1| null|2016-12-22| 
| 2| null|2016-12-23| 
| 2| null|2016-12-23| 
| 3| 3.0|2016-12-22| 
| 3| 2.0|2016-12-22| 
+---+-----+----------+ 
+-----------------+----------+----------+ 
|  avg(value)|max(value)|min(value)| 
+-----------------+----------+----------+ 
|2.466666666666667|  3.0|  2.0| 
+-----------------+----------+----------+ 
+---+----------+----------+----------+ 
|key|avg(value)|max(value)|min(value)| 
+---+----------+----------+----------+ 
| 1|  2.4|  2.4|  2.4| 
| 2|  null|  null|  null| 
| 3|  2.5|  3.0|  2.0| 
+---+----------+----------+----------+ 

スパークnullではなくnull値がこれらの関数で無視されたことを示します。ただし、列にNULL値のみが含まれている場合、これらの関数はNULL値を返します。

関連する問題