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 使用左外连接给出不正确的结果的主要内容,如果未能解决你的问题,请参考以下文章

与子查询相比,为啥左外连接查询给出不同的结果?

Spark 2.2 空安全左外连接空指针异常

内连接与左外链接的区别

如何将 LINQ 左外连接限制为一行

左外连接不返回预期的结果集

数据算法 --hadoop/spark数据处理技巧 --(3.左外连接 4.反转排序)