我有一个spark DataFrame,我想在groupby之后计算变量的唯一值的数量。
在熊猫中我可以获得它:df.groupby('UserName').apply(lambda x: x['Server'].nunique())
当df
是pyspark数据帧时,如何获得相同的结果?
答案 0 :(得分:3)
您可以将countDistinct
与agg
:
df.groupBy('UserName').agg(countDistinct('Server').alias('Server'))
答案 1 :(得分:0)
因此您可以使用@pandas_udf在pyspark中实现类似pandas.groupby()。apply的逻辑 这是向量化方法,比简单的udf更快。
from pyspark.sql.functions import pandas_udf,PandasUDFType
df3 = spark.createDataFrame(
[("a", 1, 0), ("a", -1, 42), ("b", 3, -1), ("b", 10, -2)],
("key", "value1", "value2")
)
from pyspark.sql.types import *
schema = StructType([
StructField("key", StringType()),
StructField("avg_value1", DoubleType()),
StructField("avg_value2", DoubleType()),
StructField("sum_avg", DoubleType()),
StructField("sub_avg", DoubleType())
])
@pandas_udf(schema, functionType=PandasUDFType.GROUPED_MAP)
def g(df):
gr = df['key'].iloc[0]
x = df.value1.mean()
y = df.value2.mean()
w = df.value1.mean() + df.value2.mean()
z = df.value1.mean() - df.value2.mean()
return pd.DataFrame([[gr]+[x]+[y]+[w]+[z]])
df3.groupby("key").apply(g).show()
您可以在 def
中使用所有熊猫直接功能您将得到以下结果:
+---+----------+----------+-------+-------+
|key|avg_value1|avg_value2|sum_avg|sub_avg|
+---+----------+----------+-------+-------+
| b| 6.5| -1.5| 5.0| 8.0|
| a| 0.0| 21.0| 21.0| -21.0|
+---+----------+----------+-------+-------+
因此,您可以在分组数据中的其他字段之间进行更多计算,并将它们以列表格式添加到数据框中。