我们正在尝试将原始的python代码库迁移到pyspark。议程是对数据框(以前是熊猫,现在是火花)进行一些过滤,然后按用户ID对其进行分组,最后在顶部应用meanshift聚类。
我在分组数据上使用pandas_udf(df.schema, PandasUDFType.GROUPED_MAP)
。但是现在在表示最终输出的方式上存在一个问题。
假设我们在输入数据帧中有两列user-id
和location
。对于每个用户,我们需要获取所有群集(在location
上,仅保留最大的群集,然后返回其属性,即3维向量)。假设三元组的列为col-1
,col-2
和col-3
。我只能想到使用None
之类的东西来创建具有5列的原始数据帧,并将这3个字段设置为withColumn('col-i', lit(None).astype(FloatType()))
。然后,在每个用户的第一行中,我计划用这些属性填充这三列。但这看起来确实很丑陋,并且不必要地浪费了很多空间,因为除了第一行之外,col-1
,col-2
和col-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 |
+--------------------------------------------+
这感觉太不对了。有一种优雅的方法吗?
答案 0 :(得分:0)
我最终要做的是,按用户ID将df分组,并在列上应用functions.collect_list
,以便每个单元格包含一个列表。现在,每个用户只有一行。然后,我对每行数据应用了均值漂移聚类。