【发布时间】:2017-12-06 12:04:09
【问题描述】:
我有一个想法,将不同行中的数据框值(列表)与相同的键组合起来。
该组合在不同的行中必须具有相同或更多的值,所以我不能只使用df.groupBy('id') 来获取结果。
以下是示例:
+---------+--------------------+
|id |num_list |
+---------+--------------------+
|apple |[11, 12] |
|apple |[11, 13 ,14] |
|apple |[10, 22, 25] |
|banana |[15, 26] |
|banana |[15, 29] |
|banana |[15, 27] |
+---------+--------------------+
我们可以发现id=apple 有两条记录和两个列表,例如:[11, 12],[11, 13, 14],因此它们将合并为一条新记录id=apple,num_list=[11, 12, 13, 14]
但id=apple,num_list=[10, 22, 25]不会合并。
这就是我想要的答案:
+---------+--------------------+
|id |num_list |
+---------+--------------------+
|apple |[11, 12, 13, 14] |
|apple |[10, 22, 25] |
|banana |[15, 26, 27, 29] |
+---------+--------------------+
编辑:
有些规则我要解释一下。
正如@Usernamenotfound 评论的那样,
假设苹果有三个值[11, 12, 14]、[9, 13 ,14]和[12,13,27],答案将是[9, 11, 12, 13 ,14, 27]而不是[9, 11, 12, 13 ,14]和[12,13,27]。
有一些新的例子:
+--------------------+------------+
| id|num_list |
+--------------------+------------+
|apple | [0]|
|apple | [0]|
|apple | [1]|
|apple | [1]|
|apple | [2]|
|apple | [3]|
|apple | [4]|
|apple | [5]|
|apple | [6]|
|apple | [6]|
|apple | [7]|
|apple | [7, 8]|
|apple | [9]|
|apple | [9]|
|apple | [9]|
|apple | [9, 10]|
|apple | [9, 17, 18]|
|apple | [10]|
|apple | [10]|
|apple | [10]|
+--------------------+------------+
如果我尝试来自@mayank 的代码会得到错误的答案。
+--------------------------------+---------------------------------------------------------------------------------------+
| id|num_list |
+--------------------------------+---------------------------------------------------------------------------------------+
|apple |[0] |
|apple |[0] |
|apple |[1] |
|apple |[2] |
|apple |[3] |
|apple |[4] |
|apple |[5] |
|apple |[6] |
|apple |[8, 7] |
|apple |[9, 10, 11, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 28, 29, 30, 36, 37, 38]|
|apple |[12] |
|apple |[14] |
|apple |[24] |
|apple |[31] |
|apple |[32] |
|apple |[33, 34] |
|apple |[35] |
|apple |[39] |
+--------------------------------+---------------------------------------------------------------------------------------+
任何帮助将不胜感激。
【问题讨论】:
-
可以先爆炸,然后做一个groupBy和collect_set。或者写一个 UDF。
-
@philantrovert 如果我使用
explode,然后groupBy将在结果中结合[10, 22, 25],这不是我想要的答案。 -
哦,知道了。对于彼此相邻的行。
-
是否只合并
num_list中第一个列表项相同的项? -
@philantrovert 你有什么想法来处理这个组合吗?
标签: python python-3.x python-2.7 apache-spark pyspark