我有一个如下的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)