Pyspark: получение функций для кластеризации из списка - PullRequest
0 голосов
/ 19 сентября 2019

У меня нет большого опыта работы со спарком, и у меня есть некоторые проблемы с анализом данных, чтобы применить кластеризацию в Pyspark.В основном у меня есть некоторые пользователи, с которыми связаны некоторые элементы.

Dataframe (df) состоит из строк (user, item).Пользователь может быть связан с большим количеством элементов (а также элемент может быть связан со многими пользователями).Таким образом, может быть несколько строк с одним и тем же пользователем и разными элементами.Пример:

user | item
1    |  45
2    |  58
3    |  2
1    |  97
1    |  2
2    |  3
...

Я хотел бы объединить пользователей, используя информацию о связанных элементах.

Мой подход был следующим:

  • Я группировал пользователей, преобразовывая элементы в массивы.Таким образом, мой пример df выглядит так:
user | items
1    |  [2, 45, 97]
2    |  [3, 58]
3    |  [2]
...
  • Я преобразовал каждый элемент в новый список с n элементами в качестве максимального номера элемента и значениями 0 или 1 в зависимости от индекса элемента.Поэтому после этого мой df стал
user | items
1    |  [0,0,1,0,0,0,0, ...]
2    |  [0,0,0,1,0,0,0, ...]
3    |  [0,0,1,0,0,0,0, ...]
...
  • . Я бы использовал это, чтобы получить списки для kmeans, работающих следующим образом:
from pyspark.mllib.clustering import KMeans, KMeansModel
def getRow(r):
    res = r['items']
    return res
kmtrain = df.rdd.map(lambda r: getRow(r))
model = KMeans.train(kmtrain, n_clusters, maxIterations=10, initializationMode="k-means||")

Проблема в том, что этот подходзанимает много времени.Понятно, что я здесь что-то не так делаю.Может помочь мне понять, где я делаю ошибки?

...