【发布时间】: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"))
标签: scala apache-spark