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