Spark将布尔列与字符串列进行比较与比较值相等的int和字符串的工作方式不同
Posted
技术标签:
【中文标题】Spark将布尔列与字符串列进行比较与比较值相等的int和字符串的工作方式不同【英文标题】:Spark comparing boolean column with string column works differently to comparing int and string where values are equal 【发布时间】:2018-12-06 08:43:51 【问题描述】:我有一个数据框,其中包含 boolean
、int
和 double
值以及与这些值相同但采用 String
格式的 string
列。当我添加一列来检查它们是否相等时,它适用于整数和双精度,但不适用于 booleans
,我不明白为什么。
为什么 Spark 以不同的方式对待 boolean
列的相等性以及如何解决这个问题以实现其他类型的相同行为(最好避免任何强制转换)?
以下示例
假设我有一个案例类:
case class TestData(bool: Boolean, int: Int, dbl: Double, bool_string: String, int_string: String, dbl_string: String)
我创建了一个集合并创建了一个数据框:
val df = Seq(TestData(true, 1, 1.01, "true", "1", "1.01"), TestData(false, 2, 2.02, "false", "2", "2.02")).toDF
然后添加一列来检查布尔值是否等于对应的字符串值:
val boolEq = df.withColumn("bool_eq", col("bool") === col("bool_string"))
添加一列来检查整数是否与其对应的字符串值相等:
val intEq = boolEq.withColumn("int_eq", col("int") === col("int_string"))
最后,当我在最终数据帧上显示时,输出如下所示:
intEq.show
+-----+---+----+-----------+----------+----------+-------+------+
| bool|int| dbl|bool_string|int_string|dbl_string|bool_eq|int_eq|
+-----+---+----+-----------+----------+----------+-------+------+
| true| 1|1.01| true| 1| 1.01| null| true|
|false| 2|2.02| false| 2| 2.02| null| true|
+-----+---+----+-----------+----------+----------+-------+------+
我怎样才能解决这个问题,使布尔值的工作方式与整数和其他类型相同?
编辑: 这是 Spark 版本 1.6.0
【问题讨论】:
只有铸造有效!val boolEq = df.withColumn("bool_eq", col("bool").cast("string") === col("bool_string"))
【参考方案1】:
您使用的是哪个版本的 spark?
使用 spark-shell 版本 2.3.1 对我来说工作正常
旁注:我不得不将列名从 int 更改为 int_original,因为它是保留字
案例类
case class TestData(bool: Boolean, int_original: Int, dbl: Double, bool_string: String, int_string: String, dbl_string: String)
输入
df.show
+-----+------------+----+-----------+----------+----------+
| bool|int_original| dbl|bool_string|int_string|dbl_string|
+-----+------------+----+-----------+----------+----------+
| true| 1|1.01| true| 1| 1.01|
|false| 2|2.02| false| 2| 2.02|
+-----+------------+----+-----------+----------+----------+
df.printSchema
root
|-- bool: boolean (nullable = false)
|-- int_original: integer (nullable = false)
|-- dbl: double (nullable = false)
|-- bool_string: string (nullable = true)
|-- int_string: string (nullable = true)
|-- dbl_string: string (nullable = true)
输出
import spark.implicits._
import org.apache.spark.sql.functions.col
df.withColumn("bool_eq", col("bool") === col("bool_string")).withColumn("int_eq", col("int_original") === col("int_string")).show
+-----+------------+----+-----------+----------+----------+-------+------+
| bool|int_original| dbl|bool_string|int_string|dbl_string|bool_eq|int_eq|
+-----+------------+----+-----------+----------+----------+-------+------+
| true| 1|1.01| true| 1| 1.01| true| true|
|false| 2|2.02| false| 2| 2.02| true| true|
+-----+------------+----+-----------+----------+----------+-------+------+
【讨论】:
嘿,我正在使用 1.6.0 已将其添加到我的帖子中以供参考。看起来这可能是一个版本问题。有什么想法可以用我当前的版本解决这个问题吗? 尝试导入 import scala.language.implicitConversions 那么你可能需要显式地将它转换为字符串以上是关于Spark将布尔列与字符串列进行比较与比较值相等的int和字符串的工作方式不同的主要内容,如果未能解决你的问题,请参考以下文章