我有一个数据框,其中包含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"))
添加一列以检查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
答案 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|
+-----+------------+----+-----------+----------+----------+-------+------+