Я хочу преобразовать 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.