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