【发布时间】:2019-05-14 11:30:22
【问题描述】:
我们正在尝试将原版 python 代码库迁移到 pyspark。议程是对数据框(以前是 pandas,现在是 spark)进行一些过滤,然后按用户 ID 对其进行分组,最后在顶部应用 meanshift 集群。
我在分组数据上使用pandas_udf(df.schema, PandasUDFType.GROUPED_MAP)。但是现在最终输出的表示方式存在问题。
假设我们在输入数据框中有两列,user-id 和 location。对于每个用户,我们需要获取所有的集群(在location上),只保留最大的一个,然后返回它的属性,这是一个3维向量。假设三元组的列是col-1、col-2 和col-3。我只能想到使用withColumn('col-i', lit(None).astype(FloatType())) 之类的东西创建具有5 列的原始数据框,并将这3 个字段设置为None。然后,在每个用户的第一行中,我计划用这些属性填充这三列。但这看起来真的很丑陋,而且会不必要地浪费大量空间,因为除了第一行之外,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 |
+--------------------------------------------+
这感觉太不对劲了。有没有优雅的方法?
【问题讨论】:
标签: python pandas pyspark pandas-groupby user-defined-functions