Scala-从spark数据帧中获取空列名称的最有效方法是什么



我有一个如下的df:

+----------+----------+----------+----------+----------+----------+----------+
|   user_id|     apple|    orange|    banana|      pear|     table|      desk|
+----------+----------+----------+----------+----------+----------+----------+
|         1|        13|      null|        55|      null|      null|      null|
|         2|        30|      null|      null|      null|      null|      null|
|         3|      null|      null|        50|      null|      null|      null|
|         4|         1|      null|         3|      null|      null|      null|
+----------+----------+----------+----------+----------+----------+----------+

我想得到一个数组[String],它包含只有null值的水果列名。我想在一个非常大的数据帧上这样做,所以我不想对列求和,我需要一种更快、更高效的方法。我需要一个Scala代码。

所以我需要这个列表:

List(orange,pear)

我现在有这个解决方案,求和列,但我需要一个不求和所有列的解决方案:

val fruitList:  Array[String] = here are the fruit names 
val nullFruits: Array[String] = fruitList.filter(col => dataFrame.agg(sum(col)).first.get(0) == null)

您也可以使用Spark的describe来实现这一点:

val r1  = df.select(fruitList.head, fruitList.tail :_*)
.summary("count")
//alternatively
val r1 = df.select(fruitList.head, fruitList.tail :_*)
.describe()
.filter($"summary" === "count")
+-------+-----+------+------+----+
|summary|apple|orange|banana|pear|
+-------+-----+------+------+----+
|  count|    3|     0|     3|   0|
+-------+-----+------+------+----+

并提取所需值:

r1.columns.tail
.map(c => (c,r1.select(c).head.getString(0) == "0"))
.filter(_._2 == true)
.map(_._1)

它给出:

Array(orange, pear)

相关内容

  • 没有找到相关文章