使用pyspark进行均值移位聚类

时间:2019-05-14 11:30:23

标签: python pandas pyspark pandas-groupby user-defined-functions

我们正在尝试将原始的python代码库迁移到pyspark。议程是对数据框(以前是熊猫,现在是火花)进行一些过滤,然后按用户ID对其进行分组,最后在顶部应用meanshift聚类。

我在分组数据上使用pandas_udf(df.schema, PandasUDFType.GROUPED_MAP)。但是现在在表示最终输出的方式上存在一个问题。

假设我们在输入数据帧中有两列user-idlocation。对于每个用户,我们需要获取所有群集(在location上,仅保留最大的群集,然后返回其属性,即3维向量)。假设三元组的列为col-1col-2col-3。我只能想到使用None之类的东西来创建具有5列的原始数据帧,并将这3个字段设置为withColumn('col-i', lit(None).astype(FloatType()))。然后,在每个用户的第一行中,我计划用这些属性填充这三列。但这看起来确实很丑陋,并且不必要地浪费了很多空间,因为除了第一行之外,col-1col-2col-3中的所有条目都为零。在这种情况下,输出数据帧如下所示:

+---------+----------+-------+-------+-------+
| user-id | location | col-1 | col-2 | col-3 |
+---------+----------+-------+-------+-------+
| 02751a9 | 0.894956 |  21.9 |  31.5 |  54.1 |
| 02751a9 | 0.811956 |  null |  null |  null |
| 02751a9 | 0.954956 |  null |  null |  null |
|                     ...                    |
| 02751a9 | 0.811956 |  null |  null |  null |
+--------------------------------------------+
| 0af2204 | 0.938011 |  11.1 |  12.3 |  53.3 |
| 0af2204 | 0.878081 |  null |  null |  null |
| 0af2204 | 0.933054 |  null |  null |  null |
| 0af2204 | 0.921342 |  null |  null |  null |
|                     ...                    |
| 0af2204 | 0.978081 |  null |  null |  null |
+--------------------------------------------+

这感觉太不对了。有一种优雅的方法吗?

1 个答案:

答案 0 :(得分:0)

我最终要做的是,按用户ID将df分组,并在列上应用functions.collect_list,以便每个单元格包含一个列表。现在,每个用户只有一行。然后,我对每行数据应用了均值漂移聚类。