spark对左外联接给出了不正确的结果

ne5o7dgx  于 2021-07-12  发布在  Spark
关注(0)|答案(2)|浏览(521)

我在pyspark中做了一个简单的左-外连接,它没有给出正确的结果。请看下面。值5(在a列中)介于1(b列)和10(c列)之间,这就是为什么b和c应该在第一行的输出表中。但我得到了空值。我在3种不同的rdbms 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|
+---+----+----+----+
lsmepo6l

lsmepo6l1#

语法左连接此处输入链接说明

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
5uzkadbs

5uzkadbs2#

问题是spark将列作为字符串加载,而不是int。spark对字符串进行了>=和<=比较,这就是为什么结果不一致的原因。将a、b、c列转换为int解决了这个问题。

x=x.withColumn('A',x['A'].cast('int'))
y=y.withColumn('B',x['B'].cast('int'))
y=y.withColumn('C',x['C'].cast('int'))

相关问题