某一列中的多个列,其列名与等级列相对应-Pyspark DataFrame

时间:2018-11-14 14:27:08

标签: python apache-spark rdd

最初,我有一个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内部使用什么功能。有什么帮助吗?

0 个答案:

没有答案