繁体   English   中英

如何处理 dataframe Spark/Scala 上的 null/空值

[英]How to handle the null/empty values on a dataframe Spark/Scala

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

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

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

我不想用其他值替换 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"))

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

我对这个问题做了一些研究,结果表明,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,这表示在这些函数中忽略了空值。 但是,如果列仅包含空值,则这些函数将返回空值。

与其中一条评论相反,忽略空值并不正确。 这是一种方法:

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

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

添加到其他答案:记住 null 和 NaN 是不同的东西来激发:

  1. NaN 不是数字,其中包含 NaN 的列上的数字聚合结果为 NaN
  2. null 是一个缺失值,null 列上的数字聚合会忽略它,就好像该行根本不存在一样
df_=spark.createDataFrame([(1, np.nan), (None, 2.0),(3,4.0)], ("a", "b"))
df_.show()
|   a|  b|
+----+---+
|   1|NaN|
|null|2.0|
|   3|4.0|
+----+---+

df_.agg(F.mean("a"),F.mean("b")).collect()
[Row(avg(a)=2.0, avg(b)=nan)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM