Вызываемый объект столбца в Dataframe Spark 2.2.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|
# +----+----+

Мне нужно деконструировать его, а затем сделать нуль-сейф равным по столбцу, чтобы сравнить и вернуть его вместе. Это код, который делает это. (его можно вставить и запустить, как есть, работает в версии 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. (заметьте, не можете использовать панды)

Теги:
dataframe
apache-spark
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"))

где первое должно быть предпочтительным, когда оно доступно.

См. Включение нулевых значений в Apache Spark Join

Ещё вопросы

Сообщество Overcoder
Наверх
Меню