У меня нет большого опыта работы со спарком, и у меня есть некоторые проблемы с анализом данных, чтобы применить кластеризацию в 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||")
Проблема в том, что этот подходзанимает много времени.Понятно, что я здесь что-то не так делаю.Может помочь мне понять, где я делаю ошибки?