代码之家  ›  专栏  ›  技术社区  ›  Tibberzz

DataFrame Spark 2.2.1上的可调用列对象

  •  1
  • Tibberzz  · 技术社区  · 6 年前

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

    我需要对它进行解构,然后在列上执行一个空的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。(注意,不能使用熊猫)

    1 回复  |  直到 6 年前
        1
  •  2
  •   hi-zir    6 年前

    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