我有这样一个Dataframe:
City State Hour Score Percentage
DEN CO 1 0 0
DEN CO 1 0 0
DEN CO 2 2 99
DEN CO 3 0 0
NYC NYC 1 0 0
我希望它看起来像这样:
City State total_hours total_scores total_perct. total_volume
DEN CO [1,2,3] [0,2,0] [0,99,0] [2,1,1]
NYC NYC [1] [0] [0] [1]
为了 total_hours
我只是在做一个 collect_set
对于 City
以及 State
对于 total_scores
我为每个特定的小时做一个集合,然后收集所有小时的所有分数。例:第一个小时有两个分数,0和0,我只取其中一个,然后第二个小时有1,所以它变成了 [0,2]
. 同样的事情 total_perct.
为了 total_volume
,我记下了每小时的计数 collect_list
在同一个城市和州的所有时间。
这基本上就是我想要达到的目标。如果我做一个 groupBy
像这样:
df.groupBy("city", "state", "hour")
.agg(collect_set("Hour").alias("total_hours"), collect_set("Score").alias("total_scores"),
collect_set("Percentage").alias("total_perct."), count("hour").alias("total_volume"))
我将获得以下Dataframe:
City State total_hours total_scores total_perct. total_volume
DEN CO [1] [0] [0] 2
DEN CO [2] [2] [99] 1
DEN CO [3] [0] [0] 1
NYC NYC [1] [0] [0] 1
我不明白接下来该怎么办。我怎样才能得到我现在所拥有的并获得最终的结果呢?我用的是Pypark。
2条答案
按热度按时间yduiuuwa1#
Spark<2.4
需要使用
udf
但在这种情况下速度很慢(Spark2.4+
好的,这是我的工作
collect_set
以及collect_list
.如果你不把
orderBy
在此步骤中,结果列表的顺序将是混合的。cdmah0mi2#
另一种方法是使用一个窗口计算小时的出现次数,然后根据分区筛选1个索引(idx),然后使用groupby+collect\u list
输出: