在PySpark中,我希望用键值对对对两个rdd进行完全的外部联接,其中键可能是None
。
例如:
rdd1 = sc.parallelize([(None, "a"), (None, "b")])
rdd2 = sc.parallelize([(None, "c"), (None, "d")])
join_rdd = rdd1.join(rdd2)
PySpark似乎加入了没有密钥的记录:
^{pr2}$但是,在SQL中,当我连接两个表时:
Table1: Table2:
key val key val
NULL a NULL c
NULL b NULL d
SELECT * FROM Table1 JOIN Table2 ON Table1.key = Table2.key
我有一个空的结果集。在
我想这是因为在Python中None == None
为真,而在SQL中NULL = NULL
为假。在
我有两个问题:
有没有一种方法可以模拟SQL行为并强制PySpark不被none加入?
是bug还是特性?作为SQL用户,我期望通过空键连接不会返回任何结果。我是PySpark的新人,在文档中找不到任何关于joiningnones的东西。也许值得在Spark编程指南中做些注释?
还是我错了?在
谢谢!在
你的期望是错误的。RDDAPI不遵循SQL语义,也从未打算这样做。
RDD.join
是一个简单的基于散列的链接,它与一个{a1}相连,它首先是为了提供有意义的None
哈希。在如果您想要类似SQL的语义,则应使用Spark SQL/数据帧:
如果您想在RDD上获得类似的结果,请过滤掉
^{pr2}$None
之前的None
键:相关问题 更多 >
编程相关推荐