【问题标题】:meanshift clustering using pyspark使用 pyspark 进行均值偏移聚类
【发布时间】:2019-05-14 11:30:22
【问题描述】:

我们正在尝试将原版 python 代码库迁移到 pyspark。议程是对数据框(以前是 pandas,现在是 spark)进行一些过滤,然后按用户 ID 对其进行分组,最后在顶部应用 meanshift 集群。

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

假设我们在输入数据框中有两列,user-idlocation。对于每个用户,我们需要获取所有的集群(在location上),只保留最大的一个,然后返回它的属性,这是一个3维向量。假设三元组的列是col-1col-2col-3。我只能想到使用withColumn('col-i', lit(None).astype(FloatType())) 之类的东西创建具有5 列的原始数据框,并将这3 个字段设置为None。然后,在每个用户的第一行中,我计划用这些属性填充这三列。但这看起来真的很丑陋,而且会不必要地浪费大量空间,因为除了第一行之外,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 |
+--------------------------------------------+

这感觉太不对劲了。有没有优雅的方法?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-10
      • 2017-12-09
      • 2019-10-14
      • 2017-03-07
      • 2016-01-28
      • 1970-01-01
      • 2014-08-17
      相关资源
      最近更新 更多