Dataframe Spark 2.2.1 上的可调用列对象

Posted

技术标签:

【中文标题】Dataframe Spark 2.2.1 上的可调用列对象【英文标题】:Callable Column Object on Dataframe Spark 2.2.1 【发布时间】:2018-06-15 17:57:12 【问题描述】:

在 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|
# +----+----+

我需要对其进行解构,然后在列上执行一个空安全等于以进行比较并将其重新组合在一起。这是执行此操作的代码。 (它可以粘贴并按原样运行,在 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。 (注意,不能使用 pandas)

【问题讨论】:

另外,这对我有用:return (right.id == left.id_2) | (right.id.isNull() & left.id_2.isNull()) 【参考方案1】:

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

【讨论】:

以上是关于Dataframe Spark 2.2.1 上的可调用列对象的主要内容,如果未能解决你的问题,请参考以下文章

spark 2.3.1 上的 dataframe,Describe() 函数抛出 Py4JJavaError

1.Spark SQL基础—Spark SQL概述Spark SQL核心编程—DataFrameDataSet

带有浮点数 Spark 1.6 的 DataFrame 上的 SQL 百分位数 - 任何可能的解决方法? [复制]

使用 Scala 将多列转换为 Spark Dataframe 上的一列地图

Spark- How to concatenate DataFrame columns

如何在加入(广播)和使用 Spark 收集之间进行选择