Как преобразовать DataFrame покупки в тип Spark DistributedMatrix, чтобы вычислить сходства между элементами? - PullRequest
0 голосов
/ 23 октября 2018

Я хочу преобразовать Spark DataFrame в CoordinateMatrix, а затем RowMatrix, чтобы впоследствии вычислить косинусное сходство между столбцами.

Датафрейм - это покупка пользователей: Образец данных:

 arr = np.array([
['b5ad805c-f295-4852-82fc-961a88',12732936],
['0FD6955D-484C-4FC8-8C3F-DA7D28','Gklb38'],
['0E3D17EA-BEEF-4931-8104',12909841],
['CC2877D0-A15C-4C0A-AD65-762A35C1','12645715'],
['CC2877D0-A15C-4C0A-AD65-762A35C1',12909837],
['6AC9C45D-A891-4BEA-92B1-04224E9C65ED', '12894376'],
['CFF7BAB7-C5E1-490D-B257-AE58CA071362', 'Gklb38' ]])

df_purchases = pd.DataFrame(arr, columns = ['user_id','basket'])

, где user_id - идентификатор пользователя, который приобрел идентификатор продукта (предмет) в поле корзина

Первоначально я использовал Pandas DataFrame и crosstab:

  df_cross = pd.crosstab(df_purchases.user_id, df_purchases.basket).astype('bool').astype('int')

, чтобы покупки в расчете на пользователя в строке и product_id в качестве столбцов, где, еслипользователь купил ID1, 1 = купил, в противном случае = 0 :

|----------|-------------|---------|----------|
|  user_id | item_id1    | item_id2| item_id3 |
 ---------------------------------------------
| user_1   |      0      |    1    |    0     |
----------------------------------------------- 
| user_2   |      1      |    0    |    0     |
----------------------------------------------- 
| user_3   |      0      |    1    |    1     |
----------------------------------------------- 

Получив данные в этом формате, я вычисляю сходства.Но поскольку у меня большой набор данных из более чем 50000 элементов и 20000 пользователей, мне нужно заменить оригинальный метод с использованием кросс-таблицы на Spark DistributedMatrix ( CoordinateMatrix или RowMatrix ) для использования распределенныхвычисления.

    # Create a Spark DataFrame from Pandas
     spark_df = spark.createDataFrame(df_cross)

Я не совсем понимаю, как это сделать, поскольку я новичок в использовании spark, и хотя я нашел некоторые идеи из этого ответа на вопрос , я не смогвыяснить, как построить CoordinateMatrix и проиндексировать поля , поскольку они имеют тип String , в то время как CoordinateMatrix работает с int Type .

Итак, мои вопросы:

  • Как создать CoordinateMatrix?
  • Как проиндексировать поля, а также иметь возможность сопоставить их с реальнымиИдентифицировать позже после сходства расчетов?(например, если идентификатор продукта равен GK38LB и предположим, что его сопоставленный индекс равен 1. В матрице сходств он будет представлен как 1. Как сопоставить это значение с исходным значением?). Этот вопрос похож на мой, но в Scala.
...