最初,我有一个Spark数据框,其中包含产品相似之处:
|----------|-------------|---------|
|product_1 | product_2 | sim |
-----------------------------------
| id_1 | id_4 | 0.70 |
------------------------------------
| id_2 | id_3 | 0.5 |
------------------------------------
| id_2 | id_5 | 0.75 |
------------------------------------
|id_3 | id_6 | 0.4 |
-----------------------------------
| id_1 | id_7 | 0.32 |
------------------------------------
| id_4 | id_3 | 0.5 |
------------------------------------
| id_3 | id_5 | 0.2 |
------------------------------------
在仅将前5个相似的产品都保留后,我按product_1
进行了分组,并使用collect_list()创建了一个列,其中每个列表中最相似的5个产品都在列表中。
groupbyID1 = filter_top_5.groupby('product_1').agg(collect_list('product_2').alias("top-similar"))
我不确定的是:使用collect_list是否可以确保分别翻译groupby
之后的行的顺序?我的意思是最相似的产品 first ro w,会成为列表中的第一个元素,依此类推吗?还是它们在列表中可能没有顺序?
filter_top_5 是一个类似的Spark DataFrame(我使用window
和filter
通过“相似度” <= 5来获得它)。
|----------|-------------|---------|---------|
|product_1 | product_2 | sim | 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 | top-similar |
--------------------------
| id_1 | [id_4,id_7] |
---------------------------
| id_2 | [id_5,id_3] |
可能的答案是在此collect_list by preserving order based on another variable中,而不是建议的其他答案。