PySpark сравнивает два кадра данных и находит количество совпадений - PullRequest
0 голосов
/ 03 марта 2019

У меня есть 2 фрейма данных pyspark, после некоторых манипуляций, состоящих из 1 столбца каждый, но оба имеют разную длину.dataframe 1 - это имя ингредиента, dataframe 2 содержит ряды длинных строк ингредиентов.

DATAFRAME 1:

ingcomb.show(10,truncate=False)
+---------------------------------+
|products                         |
+---------------------------------+
|rebel crunch granola             |
|creamed honey                    |
|mild cheddar with onions & chives|
|berry medley                     |
|sweet relish made with sea salt  |
|spanish peanuts                  |
|stir fry seasoning mix           |
|swiss all natural cheese         |
|yellow corn meal                 |
|shredded wheat                   |
+---------------------------------+
only showing top 10 rows

DATAFRAME 2:

reging.show(10, truncate=30)
+------------------------------+
|                   ingredients|
+------------------------------+
|apple bean cookie fruit kid...|
|bake bastille day bon appét...|
|dairy fennel gourmet new yo...|
|bon appétit dairy free dinn...|
|bake bon appétit california...|
|bacon basil bon appétit foo...|
|asparagus boil bon appétit ...|
|cocktail party egg fruit go...|
|beef ginger gourmet quick &...|
|dairy free gourmet ham lunc...|
+------------------------------+
only showing top 10 rows

Мне нужносоздайте цикл (любые другие предложения тоже приветствуются!), чтобы циклически проходить через фрейм данных 1 и сравнивать значения со строками фрейма данных через «лайк» и давать мне общее количество совпадений.

Желаемый результат:

+--------------------+-----+
|         ingredients|count|
+--------------------+-----+
|rebel crunch granola|  183|
|creamed honey       |   87|
|berry medley        |   67|
|spanish peanuts     |   10|
+--------------------+-----+

Я знаю, что работает следующий код:

reging.filter("ingredients like '%sugar%'").count()

и пытался реализовать что-то вроде

for i in ingcomb:
    x = reging.select("ingredients").filter("ingredients like '%i%'").count()

Но я не могу заставить pyspark рассматривать 'i' как значение из ingcomb вместо символа i.

Я пробовал решения из Spark. Сравнивает два кадра данных и находит количество совпадений , но, к сожалению,они не работают.Я запускаю это в GCP и получаю сообщение об ошибке при попытке запустить toPandas - из-за разрешений не могу установить pandas.

1 Ответ

0 голосов
/ 06 марта 2019

На самом деле мы смогли обойти эту проблему, где сначала мы будем получать счетчики в рамках кадра данных, а затем сопоставлять их с объединением.Пожалуйста, не стесняйтесь давать лучшие предложения.Новички в кодировании здесь.

counts= reging.select(f.explode("array(Ingredients)").alias('col'))
.groupBy('col').count().orderBy("count", ascending=False)
...