Dataframe Spark 2.2.1上的可调用列对象

问题描述 投票:1回答:1

在Spark 2.2.1中,这个调用相当于什么:

df.column_name.eqNullSafe(df2.column_2)

df.column_name不可调用。它工作在2.3.0但在2.2.1我得到错误:TypeError: 'Column' object is not callable

这是一个复制的例子。我有一个示例数据帧:

# +----+----+
# |  id| var|
# +----+----+
# |   1|   a|
# |   2|null|
# |null|   b|
# +----+----+

我需要解构它,然后对列进行null-safe equals进行比较并将其重新组合在一起。这是执行此操作的代码。 (它可以按原样粘贴和运行,在2.3.0中工作,再现2.2.1中的错误)

df = spark.createDataFrame(
    [
        ('1', 'a'),
        ('2', None),
        (None, 'b')
    ],
    ('id', 'var')
)


def get_condition(right, left):
    return right.id.eqNullSafe(left.id_2)


right_df = df.select(df.columns[:1])
left_df = df.filter(df.var.isNotNull()).withColumnRenamed('id', 'id_2')

result = right_df.join(left_df, get_condition(right_df, left_df), how='left')

result.select('id', 'var').show()

我想修改get_condition方法的调用以使用列的可调用版本来调用eqNullSafe。 (注意,不能使用熊猫)

python apache-spark dataframe pyspark
1个回答
2
投票

eqNullSafe已包含在Spark 2.3(SPARK-20290)中,因此您将无法在2.2中使用它。

有不同的替代方案(SQL / DataFrame):

  • id1 IS NOT DISTINCT FROM id / expr("id IS NOT DISTINCT FROM id2")(Spark 2.2或更高版本)
  • ((id1 IS NULL) AND (id2 IS NULL)) OR (id1 = id2) / ((col("id1").isNull() & col("id2").isNull()) | (col("id1") == col("id2"))

第一个应该是可用的首选。

Including null values in an Apache Spark Join

© www.soinside.com 2019 - 2024. All rights reserved.