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 【问题描述】:

我有一个数据框,其中包含 booleanintdouble 值以及与这些值相同但采用 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和字符串的工作方式不同的主要内容,如果未能解决你的问题,请参考以下文章

将数据框“df1”的字符串列与数据框“df2”的另一个字符串列进行比较,基于哪些其他列进行比较

MySQL字符串列与整数比较

将 NTEXT 列与常量值进行比较的正确方法是啥?

通过字符串列的最大值和最小值查找数据行中的值是不是相等

== 检查布尔值是不是完全相等? - 爪哇

javascript基础:等号比较