#arrays #string #pyspark #apache-spark-sql #compare
#массивы #строка #pyspark #apache-spark-sql #Сравнить
Вопрос:
Существует два DFS:
df1:
Word Count
abd 1
abc 2
ad 3
df2:
words, CountSum
[ad,as,abd] 0
[abc,ad] 0
и так далее.
Моя главная цель — перебрать каждое «значение» в столбце words в df2, сопоставить его со столбцом word в df1.
если найдено совпадение — добавьте количество df1 к количеству df2.
пример выше,
в df2 — [abd,ad] находятся в df1.word —> так что CountSum=count(ad) count(abd) = 4 и так далее
Теперь DF2 final:
words CountSum
[ad,as,abd] 4
[abc,ad] 5
До сих пор у меня было общее представление о том, что мне нужно будет присоединиться к DFs и разорвать arrray, чтобы получить требуемый результат, но они были пронизаны ошибками несоответствующих типов, и столбец не может быть повторен.
Кроме того, можно ли это сделать с помощью встроенного метода в pyspark или мне нужно использовать UDF?
Заранее спасибо.
Комментарии:
1.
CountSum
в начале всегда 0?2. да,; это производное поле, которое зависит от фильтра. Поэтому, если слова не совпадают, сумма будет равна 0. Любая другая рекомендация была бы полезной.
Ответ №1:
Я бы сделал что-то вроде этого :
from pyspark.sql import functions as F
df2.withColumn("word", F.explode("words")).join(df, how="left", on="word").groupBy(
"words"
).agg(F.sum("count").alias("CountSum")).show()
------------- --------
| words|CountSum|
------------- --------
|[ad, as, abd]| 4|
| [abc, ad]| 5|
------------- --------
Комментарии:
1. Похоже, это тот ответ, который я искал. Спасибо за ответ. Возможно ли это сделать с pandas UDF / UDF в целом? подвопрос: «разорвать и объединить с group by» против UDF? Что будет оптимальным для миллионов строк?
2. встроенный, как правило, лучше, чем UDF. В моем решении у вас есть equi join, который является хорошим способом создания соединения, чего у вас не будет ни с одним UDF.