Spark DataFrame 选择空值
Posted
技术标签:
【中文标题】Spark DataFrame 选择空值【英文标题】:Spark DataFrame select null value 【发布时间】:2019-10-11 07:31:38 【问题描述】:我有一个 spark 数据框,其中几列为空。我需要创建一个新的数据框,添加一个新列“error_desc”,该列将提及每行具有空值的所有列。我需要在不提及每个列名的情况下动态执行此操作。
例如:如果我的数据框低于
+-----+------+------+
|Rowid|Record|Value |
+-----+------+------+
| 1| a| b|
| 2| null| d|
| 3| m| null|
+-----+------+------+
我的最终数据框应该是
+-----+------+-----+--------------+
|Rowid|Record|Value| error_desc|
+-----+------+-----+--------------+
| 1| a| b| null|
| 2| null| d|record is null|
| 3| m| null| value is null|
+-----+------+-----+--------------+
【问题讨论】:
您能否提供示例输入数据框并将其格式化为代码,以便我们了解您的问题。 Rowid 记录值 1 a b 2 null d 3 m null 我已经编辑了你的问题格式以便更好地理解,请提交 @Nikk 完成.. 你能帮忙吗? 这些值来自我动态读取的文件..所以我不想在代码中写列名.. 【参考方案1】:我在 Input DataFrame 中添加了几行以涵盖更多情况。您不需要对任何列进行硬编码。在UDF
下方使用,它会给你想要的输出。
scala> import org.apache.spark.sql.Row
scala> import org.apache.spark.sql.expressions.UserDefinedFunction
scala> df.show()
+-----+------+-----+
|Rowid|Record|Value|
+-----+------+-----+
| 1| a| b|
| 2| null| d|
| 3| m| null|
| 4| null| d|
| 5| null| null|
| null| e| null|
| 7| e| r|
+-----+------+-----+
scala> def CheckNull:UserDefinedFunction = udf((Column:String,r:Row) =>
| var check:String = ""
| val ColList = Column.split(",").toList
| ColList.foreach x =>
| if (r.getAs(x) == null)
|
| check = check + x.toString + " is null. "
|
| check
| )
scala> df.withColumn("error_desc",CheckNull(lit(df.columns.mkString(",")),struct(df.columns map col: _*))).show(false)
+-----+------+-----+-------------------------------+
|Rowid|Record|Value|error_desc |
+-----+------+-----+-------------------------------+
|1 |a |b | |
|2 |null |d |Record is null. |
|3 |m |null |Value is null. |
|4 |null |d |Record is null. |
|5 |null |null |Record is null. Value is null. |
|null |e |null |Rowid is null. Value is null. |
|7 |e |r | |
+-----+------+-----+-------------------------------+
【讨论】:
你能帮我理解一下吗 - struct(df.columns map col: _*)))。 它只是整行的结构。 如何为整行的结构定义模式?我想把所有东西都写成字符串以上是关于Spark DataFrame 选择空值的主要内容,如果未能解决你的问题,请参考以下文章