首页 > 解决方案 > 如何将购买 DataFrame 转换为 Spark DistributedMatrix 类型以计算项目之间的相似性?

问题描述

我想将 a 转换Spark DataFrame为 a CoordinateMatrix,然后再RowMatrix计算列之间的余弦相似度。

Dataframe 是用户的购买: 数据样本:

 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是在字段中购买产品 ID(项目)的用户 ID

最初,我使用 Pandas DataFrame 和crosstab

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

将每个用户购买的行和 product_id(s) 作为列,如果用户购买了 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(CoordinateMatrixRowMatrix)来利用分布式计算。

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

我对如何做到这一点感到困惑,因为我是使用 spark 的新手,即使我从这个问题的答案中找到了一些见解,但我无法弄清楚如何构建CoordinateMatrix和索引这些字段,因为它们的类型是 String,而CoordinateMatrixint Type一起使用。

所以我的问题是:

标签: pythonpysparkapache-spark-sqlcosine-similarity

解决方案


推荐阅读