Spark比较布尔值列和字符串列的方法与比较值相等的int和string的方法不同

时间:2018-12-06 08:43:51

标签: scala apache-spark

我有一个数据框,其中包含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"))

添加一列以检查int是否等于它们的字符串值对应物:

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|
+-----+---+----+-----------+----------+----------+-------+------+

如何解决这个问题,使布尔值与int和其他类型的工作方式相同?

编辑: 这是Spark版本1.6.0

1 个答案:

答案 0 :(得分: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|
+-----+------------+----+-----------+----------+----------+-------+------+