首页 > 解决方案 > Scala Spark数据帧过滤器使用基于可用值的多列

问题描述

我需要使用以下标准过滤数据框。

我有 2 列 4Wheel(斯巴鲁、丰田、通用、空/空)和 2Wheel(雅马哈、哈雷、印度、空/空)。

我必须在 4Wheel 上过滤值(斯巴鲁、丰田),如果 4Wheel 包含空/空值,则在 2Wheel 上过滤值(雅马哈、哈雷)

我在不同的示例中找不到这种类型的过滤。我是 spark/scala 的新手,所以没有足够的想法来实现它。

谢谢,巴伦。

标签: scalaapache-sparkapache-spark-sql

解决方案


您可以使用 spark SQL 内置函数when来检查列是否为空或空,并进行相应的过滤:

import org.apache.spark.sql.functions.{col, when}

dataframe.filter(when(col("4Wheel").isNull || col("4Wheel").equalTo(""), 
                   col("2Wheel").isin("Yamaha", "Harley")
                ).otherwise(
                   col("4Wheel").isin("Subaru", "Toyota")
                ))

因此,如果您有以下输入:

+---+------+------+
|id |4Wheel|2Wheel|
+---+------+------+
|1  |Toyota|null  |
|2  |Subaru|null  |
|3  |GM    |null  |
|4  |null  |Yamaha|
|5  |      |Yamaha|
|6  |null  |Harley|
|7  |      |Harley|
|8  |null  |Indian|
|9  |      |Indian|
|10 |null  |null  |
+---+------+------+

您会得到以下过滤后的输出:

+---+------+------+
|id |4Wheel|2Wheel|
+---+------+------+
|1  |Toyota|null  |
|2  |Subaru|null  |
|4  |null  |Yamaha|
|5  |      |Yamaha|
|6  |null  |Harley|
|7  |      |Harley|
+---+------+------+

推荐阅读