如何同时分组/应用两个Spark DataFrame?

时间:2018-10-11 06:06:27

标签: apache-spark pyspark apache-spark-sql pyspark-sql

/ *我认为我的问题与语言无关,但是如果有问题,我正在使用PySpark。 * /

情况

我目前有两个Spark DataFrame:

一个具有每分钟心率的每分钟数据(每人每天1440行)的数据:

 | Person |       date |  time | heartrate |
 |--------+------------+-------+-----------|
 |      1 | 2018-01-01 | 00:00 |        70 |
 |      1 | 2018-01-01 | 00:01 |        72 |
 |    ... |        ... |   ... |       ... |
 |      4 | 2018-10-03 | 11:32 |       123 |
 |    ... |        ... |   ... |       ... |

以及另一个包含每日元数据的每日数据(每人每天1行)的DataFrame,包括的聚类结果,即人Y的哪个聚类天X落入: / p>

| Person |       date | cluster | max_heartrate  |
|--------+------------+---------+----------------|
|      1 | 2018-01-01 |       1 |            180 |
|      1 | 2018-01-02 |       4 |            166 |
|    ... |        ... |     ... |            ... |
|      4 | 2018-10-03 |       1 |            147 |
|    ... |        ... |     ... |            ... |

(请注意,聚类是每个人单独进行的,因此人1的聚类1与人2的聚类1无关。)

目标

我现在想计算每个组和每个人的平均心率,即每个人获得不同的平均值。如果我有三个集群,那么我正在寻找这个DF:

| Person | cluster | mean_heartrate |
|--------+---------+----------------|
| 1      | 1       | 123            |
| 1      | 2       | 89             |
| 1      | 3       | 81             |
| 2      | 1       | 80             |
| ...    | ...     | ...            |

如何最好地做到这一点?从概念上讲,我想每人将这两个两个数据帧分组,然后将两个DF块发送到apply函数中。在其中(即每人),我将每天的每日DF分组并汇总,然后加入每日DF的群集ID,然后计算每个群集的平均值。

但是无法对多个DF进行分组/应用,对吗?

想法

我有两个想法,不确定哪一个有意义:

  1. 将每日DF加入到分组之前的每分钟DF ,这将导致高度冗余的数据(即每分钟复制一个集群ID)。在我的“真实”应用程序中,我可能还会有每人的数据(例如身高/体重),这将是一个完全恒定的列,即浪费更多的内存。也许那是唯一/最佳/公认的方式?

  2. 在应用之前,将DF转换为可以容纳复杂结构的DF,例如喜欢

| Person | dataframe  | key              | column    | value |
|--------+------------+------------------+-----------+-------|
|      1 | heartrates | 2018-01-01 00:00 | heartrate |    70 |
|      1 | heartrates | 2018-01-01 00:01 | heartrate |    72 |
|    ... | ...        | ...              | ...       |   ... |
|      1 | clusters   | 2018-01-01       | cluster   |     1 |
|    ... | ...        | ...              | ...       |   ... |

甚至是

| Person |   JSON |
|--------+--------|
|      1 | { ...} |
|      2 | { ...} |
| ...    | ...    |

这里的最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

  

但是无法对多个DF进行分组/应用,对吗?

不,AFAIK不适用于pyspark和pandas。


  
      
  1. 在分组之前将每日DF加入到每分钟DF中...
  2.   

这是我认为的方法。您不需要合并所有冗余列,而只需合并组操作所需的列即可。无法避免您的groupby列出现冗余,因为groupby操作将需要它们。

在熊猫中,有可能专门提供一个额外的groupby列作为pandas系列,但它需要具有与要分组的数据框完全相同的形状。但是,要创建groupby列,仍然需要合并。


  
      
  1. 在应用之前,将DF转换为可以容纳复杂结构的DF
  2.   

在性能和内存方面,除非您有多个必需的groupby操作,这些操作将从更复杂的数据结构中受益,否则我不会采用此解决方案。实际上,您首先需要付出一些努力才能真正创建数据结构。