This question already has answers here:
pyspark collect_set or collect_list with groupby
                                
                                    (2个答案)
                                
                        
                                9个月前关闭。
            
                    
我正在尝试做一些看起来很简单的事情,但是以某种方式无法弄清楚如何使用pyspark做到这一点。

我有一个带有两列(以简化)“ id”和“ strcol”的df,可能有重复的id

我想做一个df.groupBy('id'),它将为每个id返回strcol值的数组

简单的例子:

|--id--|--strCol--|
|   a  |  {'a':1} |
|   a  |  {'a':2} |
|   b  |  {'b':3} |
|   b  |  {'b':4} |
|------|----------|
would become
|--id--|-------aggsStr------|
|   a  |  [{'a':1},{'a':2}] |
|   b  |  [{'b':3},{'b':4}] |
|------|--------------------|


我试图将apply与pandas udf一起使用,但它似乎拒绝返回数组。 (或者也许我没有正确使用它)

最佳答案

您可以从collect_list模块使用pyspark.sql.functions

from pyspark.sql import functions as F
agg = df.groupby("id").agg(F.collect_list("strCol"))


一个完整的功能示例:

import pandas as pd
from pyspark.sql import functions as F

data =  {'id': ['a', 'a', 'b', 'b'], 'strCol': [{'a':1}, {'a':2}, {'b':3}, {'b':4}]}

df_aux = pd.DataFrame(data)

# df type: DataFrame[id: string, strCol: map<string,bigint>]
df = spark.createDataFrame(df_aux)


# agg type: # DataFrame[id: string, collect_list(strCol): array<map<string,bigint>>]
agg = df.groupby("id").agg(F.collect_list("strCol"))


希望这对您有所帮助!

关于python - Pyspark将StructType列聚合为每行的元素数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56397906/

10-17 00:06