我有一个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"))
否则我可以认为我的代码中存在问题。
答案 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或者您想要用来表示“无有效/非空条目”的任何内容