Сравните два столбца в разных фреймах данных, типов String и Array соответственно в pyspark

#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.