PySpark中的Join不连接任何值

2024-05-14 15:43:21 发布

您现在位置:Python中文网/ 问答频道 /正文

在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为假。在

我有两个问题:

  1. 有没有一种方法可以模拟SQL行为并强制PySpark不被none加入?

  2. 是bug还是特性?作为SQL用户,我期望通过空键连接不会返回任何结果。我是PySpark的新人,在文档中找不到任何关于joiningnones的东西。也许值得在Spark编程指南中做些注释?

还是我错了?在

谢谢!在


Tags: keynonesqlvalnullpyspark键值sc
1条回答
网友
1楼 · 发布于 2024-05-14 15:43:21

你的期望是错误的。RDDAPI不遵循SQL语义,也从未打算这样做。RDD.join是一个简单的基于散列的链接,它与一个{a1}相连,它首先是为了提供有意义的None哈希。在

如果您想要类似SQL的语义,则应使用Spark SQL/数据帧:

schema = StructType([
  StructField("_1", IntegerType(), True), StructField("_2", StringType(), False)
])

df1 = sqlContext.createDataFrame(rdd1, schema)
df2 = sqlContext.createDataFrame(rdd2, schema)
df1.join(df2, ["_1"])

如果您想在RDD上获得类似的结果,请过滤掉None之前的None键:

^{pr2}$

相关问题 更多 >

    热门问题