Обработка огромной (локальной) матрицы в Spark - PullRequest
0 голосов
/ 09 декабря 2018

Итак, я пробую совместную фильтрацию в Spark.Допустим, у меня 1 миллион пользователей, и я использую SparkML pyspark.ml.stat.Correlation.corr для вычисления корреляции Пирсона между парами пользователей.По документации этот метод возвращает :

DataFrame, который содержит матрицу корреляции столбца векторов.Этот DataFrame содержит одну строку и один столбец с именем $ METHODNAME ($ COLUMN).

Сама матрица (DenseMatrix) не распределена ( local )который, насколько я понимаю, должен уместиться в памяти моего компьютера с драйверами.

Вопрос:

  1. Охватывает ли фрейм данных, содержащий эту матрицу, несколько компьютеров?Я знаю фрейм данных разделов Spark, но я думаю, что это имеет место с несколькими строками?

  2. Как я могу сделать эту ОГРОМНУЮ локальную матрицу распределенным СДР / фреймом данных (чтобы я мог вещи )?Я ничего не могу с этим поделать, если он локальный.

thisMatrix = thisDataFrame.take(1)[0][0]
sc.parallelize(thisMatrix.toArray())

не будет работать (потому что он выбирает матрицу в одну машину).

1 Ответ

0 голосов
/ 10 декабря 2018

Я думаю, что вы, возможно, немного неправильно поняли документы.Corelation.corr возвращает DataFrame, который точно так же распараллелен, как и любой другой Pyspark DataFrame.Если вы должны выполнить следующий вызов:

pearsonCorr = Correlation.corr(dataset, 'features', 'pearson')

, данные не будут отправлены обратно на узел драйвера.Это будет верно до тех пор, пока фактическое действие, такое как collect, не будет вызвано pearsonCorr.DenseMatrix, упомянутый в Correlation документах , фактически является результатом вызова collect, а не самого вызова Correlation.corr:

pearsonCorr = Correlation.corr(dataset, 'features', 'pearson').collect()[0][0]
print(str(pearsonCorr).replace('nan', 'NaN'))

DenseMatrix([[ 1.        ,  0.0556...,         NaN,  0.4004...],
             [ 0.0556...,  1.        ,         NaN,  0.9135...],
             [        NaN,         NaN,  1.        ,         NaN],
             [ 0.4004...,  0.9135...,         NaN,  1.        ]])
...