如何处理数据框Spark / Scala上的null / empty值

时间:2016-05-12 14:17:26

标签: scala apache-spark

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

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

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

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

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

有没有办法解决这个问题?以前每个人都遇到过这个问题?这是数据类型的问题吗?

我运行这样的事情:

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

否则我可以认为我的代码中存在问题。

2 个答案:

答案 0 :(得分:3)

我对这个问题做了一些研究,结果表明,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|
+---+----------+----------+----------+

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

答案 1 :(得分:0)

与其中一条评论相反,为真,忽略了空值。这是一种方法:

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

如果只有 空值,这仍然会有问题:您需要将Min / MaxValue转换为null或者您想要用来表示“无有效/非空条目”的任何内容