最初,我有一个Spark数据框,其中包含产品相似之处:
|----------|-------------|---------|----------------|
|product_1 | product_2 | sim | similarity-rank
---------------------------------------------------|
| id_1 | id_4 | 0.70 | 1
----------------------------------------------------|
| id_1 | id_7 | 0.32 | 2
----------------------------------------------------|
| id_2 | id_5 | 0.75 | 1
----------------------------------------------------|
|id_2 | id_3 | 0.5 | 2
---------------------------------------------------|
| id_3 | id_6 | 0.4 | 1
----------------------------------------------------|
| id_3 | id_5 | 0.2 | 2
----------------------------------------------------|
| id_4 | id_3 | 0.5 | 1 |
----------------------------------------------------
要生成该代码,我使用了以下代码(目标:在列product_1
中获得与每个产品 5 个最相似的产品:
window_02 = Window.partitionBy("product_1").orderBy(df_sim_cached.sim.desc())
win_sim02 = df_sim_cached.withColumn("similarity-rank", func.row_number().over(window_02))
filter_top_5 = win_sim02.filter(win_sim02["similarity-rank"] <=5)
现在,使用该DataFrame作为输入,我想创建一个新的Spark DataFrame,其中对于每个产品,我们拥有最相似的产品,每个相似的产品都根据相似度排名位于其对应的列中。
预期输出:
|-------------|-----------|---------|----------|---------|--------|
| Product Id | RecId1 | RecId2 | RecId3 | RecId4 | RecId5 |
------------------------------------------------------------------
| id_1 | id_4 | id_7 | | | |
-------------------------------------------------------------------
| id_2 | id_5 | id_5 | | | |
-------------------------------------------------------------------
| id_3 | id_6 | id_5 | | | |
-------------------------------------------------------------------
| id_4 | id_3 | | | | |
-------------------------------------------------------------------
如您所见,有些不包含5个类似的产品,而仅包含2个或3个,依此类推。在这种情况下,其对应的列将为空。
我认为可以使用df.rdd.map
来实现,并且对于每一行,将product_2
放在其列中,如下所示:"RecId" + row.similarity-rank
但是后来不知道要在map
内部使用什么功能。有什么帮助吗?