【问题标题】:Join in PySpark joins None values加入 PySpark 加入 None 值
【发布时间】:2016-03-02 17:06:31
【问题描述】:

在 PySpark 中,我想使用键值对对两个 RDD 进行完全外部连接,其中键可能是 None。 例如:

rdd1 = sc.parallelize([(None, "a"), (None, "b")])
rdd2 = sc.parallelize([(None, "c"), (None, "d")])
join_rdd = rdd1.join(rdd2)

看起来 PySpark 加入了键为 None 的记录:

print(rdd1.join(rdd2).take(10))
>>> [(None, ('a', 'c')), (None, ('a', 'd')), (None, ('b', 'c')), (None, ('b', 'd'))]

但是,在 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 不通过 Nones 加入?

  2. 是错误还是功能?作为 SQL 用户,我期望通过空键加入不会返回任何内容。我是 PySpark 的新手,在有关 joinig Nones 的文档中一无所获。也许值得在 Spark 编程指南中做一些说明?

还是我哪里错了?

谢谢!

【问题讨论】:

    标签: python join apache-spark null pyspark


    【解决方案1】:

    你的期望是错误的。 RDD API 不遵循 SQL 语义,也从未打算这样做。 RDD.join 只是一个简单的基于哈希的链接,与 portable_hash 的链接旨在首先提供有意义的 None 哈希。

    如果你想要类似 SQL 的语义,你应该使用 Spark SQL / Data Frames:

    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 上获得类似的结果,请在 join 之前过滤掉 None 键:

    rdd1.filter(lambda x: x[0] is not None).join(rdd2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2022-09-27
      • 2022-12-10
      • 2021-02-12
      • 2021-03-01
      • 2020-12-27
      相关资源
      最近更新 更多