Apache spark Spark数据帧选择空值

Apache spark Spark数据帧选择空值,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个spark数据框,其中很少列为null。我需要创建一个新的dataframe,添加一个新的列“error_desc”,它将提到每一行都有空值的所有列。我需要动态地执行此操作,而不必提及每个列名 如果我的数据框在下面 +-----+------+------+ |Rowid|Record|Value | +-----+------+------+ | 1| a| b| | 2| null| d| | 3| m| null| +-----

我有一个spark数据框,其中很少列为null。我需要创建一个新的dataframe,添加一个新的列“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|
+-----+------+-----+--------------+

我在输入数据框中添加了几行,以涵盖更多情况。您不需要硬编码任何列。使用下面的
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    |                               |
+-----+------+-----+-------------------------------+

您能否提供示例输入数据框,并将其格式化为代码,以便我们了解您的问题。Rowid记录值1 a b 2 null d 3 m nullI已编辑您的问题格式以便更好地理解,请提交it@Nikk完成。。你能帮忙吗?这些值来自我正在动态读取的文件。。所以我不想在代码中写列名。你能帮我理解这个-struct(df.columns map col:*)吗。它只是整行的结构。如何为整行的结构定义架构?我想把一切都当作绳子