如何在SataFrame中填充缺失值?

时间:2016-04-11 15:48:16

标签: scala apache-spark dataframe apache-spark-sql

在查询mysql数据库并构建相应的数据框后,我留下了这个:

mydata.show

+--+------+------+------+------+------+------+
|id| sport|  var1|  var2|  var3|  var4|  var5|
+--+------+------+------+------+------+------+
| 1|soccer|330234|      |      |      |      |
| 2|soccer|  null|  null|  null|  null|  null|
| 3|soccer|330101|      |      |      |      |
| 4|soccer|  null|  null|  null|  null|  null|
| 5|soccer|  null|  null|  null|  null|  null|
| 6|soccer|  null|  null|  null|  null|  null|
| 7|soccer|  null|  null|  null|  null|  null|
| 8|soccer|330024|330401|      |      |      |
| 9|soccer|330055|330106|      |      |      |
|10|soccer|  null|  null|  null|  null|  null|
|11|soccer|390027|      |      |      |      |
|12|soccer|  null|  null|  null|  null|  null|
|13|soccer|330101|      |      |      |      |
|14|soccer|330059|      |      |      |      |
|15|soccer|  null|  null|  null|  null|  null|
|16|soccer|140242|140281|      |      |      |
|17|soccer|330214|      |      |      |      |
|18|soccer|      |      |      |      |      |
|19|soccer|330055|330196|      |      |      |
|20|soccer|210022|      |      |      |      |
+--+------+------+------+------+------+------+

每个var列都是:

string (nullable = true)

所以我想将所有空行更改为" null",以便能够使用" null"处理空单元格和单元格。相同,可能没有离开RDD的数据框......

2 个答案:

答案 0 :(得分:2)

我的方法是创建表达式列表。在Scala中,可以使用map来完成。另一方面,在Python中你要使用理解列表。

之后,您应该在df.select指令中解压缩该列表,如下面的示例所示。

在表达式中,空字符串将替换为空值

Scala中:

val exprs = df.columns.map(x => when(col(x) === '', null).otherwise(col(x)).as(x))
df.select(exprs:_*).show()

的Python:

# Creation of a dummy dataframe:
df = sc.parallelize([("", "19911201", 1, 1, 20.0),
                     ("", "19911201", 2, 1, 20.0),
                     ("hola", "19911201", 2, 1, 20.0),
                     (None, "20111201", 3, 1, 20.0)]).toDF()

df.show()

exprs = [when(col(x) == '', None).otherwise(col(x)).alias(x) 
         for x in df.columns]

df.select(*exprs).show()

E.g:

+----+--------+---+---+----+
|  _1|      _2| _3| _4|  _5|
+----+--------+---+---+----+
|    |19911201|  1|  1|20.0|
|    |19911201|  2|  1|20.0|
|hola|19911201|  2|  1|20.0|
|null|20111201|  3|  1|20.0|
+----+--------+---+---+----+

+----+--------+---+---+----+
|  _1|      _2| _3| _4|  _5|
+----+--------+---+---+----+
|null|19911201|  1|  1|20.0|
|null|19911201|  2|  1|20.0|
|hola|19911201|  2|  1|20.0|
|null|20111201|  3|  1|20.0|
+----+--------+---+---+----+

答案 1 :(得分:0)

一种选择是反过来 - 用空值替换空值(我个人讨厌空值......),你可以使用coalesce函数:

import org.apache.spark.sql.functions._
val result = input.withColumn("myCol", coalesce(input("myCol"), lit("")))

为多列执行此操作:

val cols = Seq("var1", "var2", "var3", "var4", "var5")
val result = cols.foldLeft(input) { case (df, colName) => df.withColumn(colName, coalesce(df(colName), lit(""))) }