Spark 使用左外连接给出不正确的结果
Posted
技术标签:
【中文标题】Spark 使用左外连接给出不正确的结果【英文标题】:Spark is Giving Incorrect Results with Left Outer Join 【发布时间】:2021-03-05 21:58:31 【问题描述】:我在 PySpark 中做一个简单的左外连接,但它没有给出正确的结果。请看下文。值 5(在 A 列中)介于 1(B 列)和 10(C 列)之间,这就是为什么 B 和 C 应该在第一行的输出表中。但我得到了空值。我已经在 3 种不同的 RDBM MS SQL、PostGres 和 SQLite 中进行了尝试,所有这些都给出了正确的结果。 Spark 中可能存在的错误??
Table x
+---+
| A|
+---+
| 5|
| 15|
| 20|
| 50|
+---+
Table y
+----+----+---+
| B| C| D|
+----+----+---+
| 1| 10|abc|
| 21| 30|xyz|
|null|null| mn|
| 11| 20| o|
+----+----+---+
SELECT x.a, y.b, y.c, y.d
FROM x LEFT OUTER JOIN
y
ON x.a >= y.b AND x.a <= y.c
+---+----+----+----+
| a| b| c| d|
+---+----+----+----+
| 5|null|null|null|
| 15| 11| 20| o|
| 20| 11| 20| o|
| 50|null|null|null|
+---+----+----+----+
【问题讨论】:
你能创建小提琴吗,例如dbfiddle.uk 这是正确的输出:dbfiddle.uk/… 我的第一个猜测是Spark中的数据类型是字符串而不是数字。 不错的猜测,但不是,我确保将 A、B、C 列强制转换为 int 并给出完全相同的结果。 不能用整数类型重现,但可以用字符串类型重现。 【参考方案1】:语法左连接 enter link description here
SELECT column1, column2 ...
FROM table_A
LEFT JOIN table_B ON join_condition
WHERE row_condition
也许对你有帮助
SELECT x.a, y.*
FROM x LEFT JOIN y ON x.id = y.xID
WHERE x.a >= y.b AND x.a <= y.c
【讨论】:
我熟悉语法及其工作原理。我的意思是 Spark 产生的结果与其他 3 个 RDBM 不同。 要获得真正的 LEFT JOIN 结果,应将表 y 条件从 WHERE 移至 ON。【参考方案2】:问题在于 Spark 将列加载为字符串,而不是整数。 Spark 正在对字符串进行 >= 和
x=x.withColumn('A',x['A'].cast('int'))
y=y.withColumn('B',x['B'].cast('int'))
y=y.withColumn('C',x['C'].cast('int'))
【讨论】:
对于小型示例表,InferSchema 也由于某种原因无法正常工作。有谁知道为什么?以上是关于Spark 使用左外连接给出不正确的结果的主要内容,如果未能解决你的问题,请参考以下文章