我正在 pyspark 中玩
GroupedData
。
这就是我的环境。
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 3.5.1
/_/
Using Scala version 2.12.18, OpenJDK 64-Bit Server VM, 11.0.24
Branch HEAD
我想知道以下是否可行。
假设我只想使用
GroupedData
的方法,而不从 pyspark.sql.functions
导入任何函数。
好吧,假设我有一些
DataFrame
并且我已经将其按 column A
分组,并且我已经得到了 GroupedData
对象。
现在我想对我的
GroupedData
对象说 sum(column B)
,然后说 avg(column C)
,也许还可以一次或通过链式方法调用来说 min(column D)
。
我可以仅使用 GroupedData 方法来做到这一点吗?
我问这个问题是因为似乎一旦我完成了
sum(column B)
,我就不再有 GroupedData
对象了,所以我无法继续进一步链接任何 GroupedData
方法。
那么(我的想法)可能吗?
如果可以的话,我们该怎么做呢?
在代码中,他们提供了一些基本示例doc
您可以使用 .agg(sf.sum(df.B).as("sumB"), sf.avg(df.C).as("avgC"))
示例:
from pyspark.sql import functions as sf
from pyspark.sql.functions import pandas_udf, PandasUDFType
df = spark.createDataFrame([(2, "Alice"), (3, "Alice"), (5, "Bob"), (10, "Bob")], ["age", "name"])
df.show()
+---+-----+
|age| name|
+---+-----+
| 2|Alice|
| 3|Alice|
| 5| Bob|
| 10| Bob|
+---+-----+
Group-by name, and count each group.
df.groupBy(df.name)
GroupedData[grouping...: [name...], value: [age: bigint, name: string], type: GroupBy]
df.groupBy(df.name).agg({"*": "count"}).sort("name").show()
+-----+--------+
| name|count(1)|
+-----+--------+
|Alice| 2|
| Bob| 2|
+-----+--------+
Group-by name, and calculate the minimum age.
df.groupBy(df.name).agg(sf.min(df.age)).sort("name").show()
+-----+--------+
| name|min(age)|
+-----+--------+
|Alice| 2|
| Bob| 5|
+-----+--------+
Same as above but uses pandas UDF.
@pandas_udf('int', PandasUDFType.GROUPED_AGG) # doctest: +SKIP
def min_udf(v):
return v.min()
df.groupBy(df.name).agg(min_udf(df.age)).sort("name").show() # doctest: +SKIP
+-----+------------+
| name|min_udf(age)|
+-----+------------+
|Alice| 2|
| Bob| 5|
+-----+------------+