Если вы работаете с Spark> = 2.4.0, вы можете использовать встроенную функцию array_except (a, b) . Функция вернет все элементы, которые присутствуют в a, но отсутствуют в b. Хотя функция работает только тогда, когда оба параметра не имеют нулевых значений, поэтому перед ее использованием нам нужно заменить null пустым массивом .
Вот версия python:
from pyspark.sql.functions import array_except, when, array, col
df = spark.createDataFrame([
[["a"], ["a", "b"]],
[None, ["b"]],
[None, ["a", "c"]],
[["d", "g"], ["d", "g"]],
[["f"], ["f"]]
], ["OVERRIDE", "B"])
df.withColumn("OVERRIDE", when(col("OVERRIDE").isNull(), array()).otherwise(col("OVERRIDE"))) \
.withColumn("diff", array_except(col("B"), col("OVERRIDE"))) \
.show()
// +--------+------+------+
// |OVERRIDE| B| diff|
// +--------+------+------+
// | [a]|[a, b]| [b]|
// | []| [b]| [b]|
// | []|[a, c]|[a, c]|
// | [d, g]|[d, g]| []|
// | [f]| [f]| []|
// +--------+------+------+
И Scala один:
import org.apache.spark.sql.functions.{array_except, when, array}
val df = Seq(
(Seq("a"), Seq("a", "b")),
(null, Seq("b")),
(null, Seq("a", "c")),
(Seq("d", "g"), Seq("d", "g")),
(Seq("f"), Seq("f"))
).toDF("OVERRIDE", "B")
df.withColumn("OVERRIDE", when($"OVERRIDE".isNull, array()).otherwise($"OVERRIDE"))
.withColumn("diff", array_except($"B", $"OVERRIDE"))
.show
// +--------+------+------+
// |OVERRIDE| B| diff|
// +--------+------+------+
// | [a]|[a, b]| [b]|
// | []| [b]| [b]|
// | []|[a, c]|[a, c]|
// | [d, g]|[d, g]| []|
// | [f]| [f]| []|
// +--------+------+------+