1

我正在尝试做一些看起来非常简单但不知怎么用 pyspark 做的事情。

我有一个带有两列的df(为了简化)'id'和'strcol',可能有重复的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 一起使用,但它似乎拒绝返回数组。(或者也许我没有正确使用它)

4

1 回答 1

2

您可以collect_listpyspark.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")) 

希望这有帮助!

于 2019-05-31T15:37:52.723 回答