у меня есть датафрейм df1
id transactions
1 [1, 3,3,3,2,5]
2 [1,2]
root
|-- id: int (nullable = true)
|-- transactions: array (nullable = false)
|-- element: string(containsNull = true)
None
у меня есть датафрейм df2
items cost
[1, 3,3, 5] 2
[1, 5] 1
root
|-- items: array (nullable = false)
|-- element: string (containsNull = true)
|-- cost: int (nullable = true)
None
Я должен проверить, находятся ли позиции в транзакциях, если это так, то суммировать затраты.
[1,3,3,5] в [1,3,3,3,5] истинно, а [1,3,3,5] в [1,2] ложно и т. Д.
результат должен быть
id transactions score
1 [1,3,3,3,5] 3
2 [1,2] null
Я пытался взорвать и объединить (inner, left_semi), методы, но все это не удалось из-за дубликатов. Проверить все элементы массива, присутствующие в другом массиве pyspark
issubset (), array_intersect () также не будет работать.
Я наткнулся на Python - проверка, является ли один список подмножеством другого . Я обнаружил, что следующее решает проблему и очень эффективно.
from collections import Counter
not Counter([1,3,3,3,5])-Counter([1,3,3,4,5])
False
>>> not Counter([1,3,3,3,5])-Counter([1,3,3,5])
False
>>> not Counter([1,3,3,5])-Counter([1,3,3,3,5])
True
я попробовал следующее
@udf("boolean")
def contains_all(x, y):
if x is not None and y is not None:
return not (lambda y: dict(Counter(y)))-(lambda x: dict(Counter(x)))
(df1
.crossJoin(df2).groupBy("id", "transactions")
.agg(sum_(when(
contains_all("transactions", "items"), col("cost")
)).alias("score"))
.show())
но выдает ошибку.
Файл "", строка 39, в содержит_все
Ошибка типа: неподдерживаемые типы операндов для -: 'function' и 'function'
Есть ли другой способ добиться этого?