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 选择空值的主要内容,如果未能解决你的问题,请参考以下文章

Spark DataFrame 数据框空值判断和处理

Apache Spark:如何使用 Java 在 dataFrame 中的空值列中插入数据

如何优化 spark 函数以用零替换空值?

在 Spark DataFrame 中将空值转换为空数组

计算Spark DataFrame中的非空值的数量

Scala Spark,比较两个 DataFrame 并选择另一列的值