【问题标题】:Spark is Giving Incorrect Results with Left Outer JoinSpark 使用左外连接给出不正确的结果
【发布时间】: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 并给出完全相同的结果。
  • 不能用整数类型重现,但可以用字符串类型重现。

标签: sql apache-spark pyspark apache-spark-sql


【解决方案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 也由于某种原因无法正常工作。有谁知道为什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多