如何处理 Spark/Scala 数据帧上的 null/空值

Ect*_*ras 4 scala apache-spark

我有一个 CSV 文件,正在处理其数据。

我正在使用数据框,并根据某些条件计算每列的平均值、最小值、最大值、平均值、总和。每列的数据可以为空或为 null。

我注意到在某些情况下我得到了最大值,或者求和了一个空值而不是一个数字。或者我在 max() 中得到的数字小于 min() 返回的输出。

我不想用其他值替换 null/空值。我所做的唯一一件事就是在 CSV 中使用这两个选项:

.option("nullValue", "null")
.option("treatEmptyValuesAsNulls", "true")
Run Code Online (Sandbox Code Playgroud)

有什么办法可以处理这个问题吗?大家以前都遇到过这个问题吗?是数据类型的问题吗?

我运行这样的东西:

data.agg(mean("col_name"), stddev("col_name"),count("col_name"), 
         min("col_name"), max("col_name"))
Run Code Online (Sandbox Code Playgroud)

否则我可以认为这是我的代码中的问题。

小智 6

我对这个问题做了一些研究,结果表明mean、max、min函数忽略空值。下面是实验代码和结果。环境:Scala、Spark 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|
+---+----------+----------+----------+
Run Code Online (Sandbox Code Playgroud)

从输出中您可以看到,组 key='1' 的列 'value' 上的mean、max、min 函数返回 '2.4' 而不是 null,这表明这些函数中忽略了 null 值。但是,如果列仅包含空值,则这些函数将返回空值。