Scala 在Spark dataframe中过滤多个列的最佳方法是什么?

Scala 在Spark dataframe中过滤多个列的最佳方法是什么?,scala,apache-spark,Scala,Apache Spark,A样本数据: +--------------------+-----+--------+----+----------+--------+-----------+ | id|click| hour| C1|banner_pos| site_id|site_domain| +--------------------+-----+--------+----+----------+--------+-----------+ | NULL

A样本数据:

+--------------------+-----+--------+----+----------+--------+-----------+
|                  id|click|    hour|  C1|banner_pos| site_id|site_domain|
+--------------------+-----+--------+----+----------+--------+-----------+
| NULL               |    0|14102100|1005|         0|1fbe01fe|   f3845767|
|10000169349117863715|    0|14102100|1005|         0|1fbe01fe|   f3845767|
|10000371904215119486|    0|NULL    |1005|         0|1fbe01fe|   f3845767|
|10000640724480838376|    0|14102100|1005|         0|1fbe01fe|   f3845767|
|10000679056417042096|    0|14102100|1005|         1|fe8cc448|   9166c161|
+--------------------+-----+--------+----+----------+--------+-----------+
预期结果:

+--------------------+-----+--------+----+----------+--------+-----------+
|                  id|click|    hour|  C1|banner_pos| site_id|site_domain|
+--------------------+-----+--------+----+----------+--------+-----------+
| NULL               |    0|14102100|1005|         0|1fbe01fe|   f3845767|
|10000371904215119486|    0|NULL    |1005|         0|1fbe01fe|   f3845767|
+--------------------+-----+--------+----+----------+--------+-----------+
我想过滤数据帧中的所有列,条件是至少有一列包含“NULL”字符串。我有很多专栏,大约30篇。 我已经看到,通过几个列,可以添加如下条件:

但是,由于我有许多列具有相同的条件,有没有办法将
视为一个集合,并将它们一起过滤? 我尝试了以下方法,但似乎不起作用:

  df2.filter(
    lit(
      df2.columns.map(col(_).contains("NULL")).contains(lit(true))
    )
  ).show()
似乎
df2.columns.map(col(41;).contains(“NULL”)).contains(lit(true))
总是返回
false

为什么是这样?你能解释一下为什么这不起作用吗?


以下代码用于上述目的

  df.filter(
    lit(true).isin(df.columns.map(col(_).contains("NULL")): _*)
  ).show()

这是您的第一个代码片段

df.columns.map(col(_).contains("NULL"))
返回一个

Array[Column]
然后尝试传递整个数组,用下面的语句搜索布尔文本“true”

df2.columns.map(col(_).contains("NULL")).contains(lit(true))
由于它是一个复杂的
数组[列]
结构,因此无法工作

但是下面的表达:

df.columns.map(col(_).contains("NULL")): _*
将每个数组元素作为单个参数发送到
isin
函数,从而使过滤器工作


希望这能解释

提供一个示例数据集和所需的输出将非常有帮助。请解释此代码的工作原理及其实际用途。
df.filter(r=> r.toSeq.exists(c => c == null))
df.filter(r=> r.toSeq.exists(c => c == null))