Scala 如何在框架中填充缺少的值?

Scala 如何在框架中填充缺少的值?,scala,apache-spark,dataframe,apache-spark-sql,Scala,Apache Spark,Dataframe,Apache Spark Sql,查询mysql数据库并构建相应的数据帧后,我只剩下以下内容: mydata.show +--+------+------+------+------+------+------+ |id| sport| var1| var2| var3| var4| var5| +--+------+------+------+------+------+------+ | 1|soccer|330234| | | | | | 2|soccer| null|

查询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留下数据帧…

我的方法是创建一个表达式列表。在Scala中,这可以使用
映射来完成。另一方面,在Python中,您需要使用理解列表

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

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

斯卡拉:

Python:

例如:


我的方法是创建一个表达式列表。在Scala中,这可以使用
映射来完成。另一方面,在Python中,您需要使用理解列表

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

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

斯卡拉:

Python:

例如:


一种选择是做相反的事情-用空值替换空值(我个人讨厌空值…),您可以使用
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(""))) }

一种选择是做相反的事情-用空值替换空值(我个人讨厌空值…),您可以使用
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(""))) }

为什么不改变你的比较代码,让它把它们平等对待呢?这样,您就可以保持源数据的完整性,并且不会浪费大量时间进行不必要的操作。如果您的表结构中有这么多空值,那么您可能设计了不正确的表结构。为什么不更改比较代码,以便它将它们视为相等的呢?这样可以保持源数据的完整性,并且不会浪费大量时间进行不必要的操作。如果您的表结构中有这么多空值,那么您可能设计了不正确的表结构。如果可以使用数据帧,那么这可以通过一种更可控的方式来完成,比如
df.na.fill(“na”),(Seq(“a”,“B”))
如果列A和B是字符串类型,并且
df.na.fill(0.0,(Seq(“A”,“B”))
如果列A和B是整数类型,如果可以使用数据帧,那么可以通过更可控的方式来完成,类似于
df.na.fill(“na”),(Seq(“A”,“B”))
如果A列和B列为字符串类型,如果A列和B列为整数类型,则
df.na.fill(0.0,(Seq(“A”,“B”))
val cols = Seq("var1", "var2", "var3", "var4", "var5")
val result = cols.foldLeft(input) { case (df, colName) => df.withColumn(colName, coalesce(df(colName), lit(""))) }