Dataframe Pypark相当于熊猫群比+;应用于列

Dataframe Pypark相当于熊猫群比+;应用于列,dataframe,group-by,pyspark,Dataframe,Group By,Pyspark,我有一个spark数据帧,我想在groupby之后计算变量的唯一值的数量 在pandas中,我可以通过以下方式获得它:df.groupby('UserName').apply(lambda x:x['Server'].nunique()) 当df是pyspark数据帧时,如何获得相同的结果 您可以将countDistinct与agg一起使用: df.groupBy('UserName').agg(countDistinct('Server').alias('Server')) 因此,您可以实现

我有一个spark数据帧,我想在groupby之后计算变量的唯一值的数量

在pandas中,我可以通过以下方式获得它:
df.groupby('UserName').apply(lambda x:x['Server'].nunique())


df
是pyspark数据帧时,如何获得相同的结果

您可以将
countDistinct
agg
一起使用:

df.groupBy('UserName').agg(countDistinct('Server').alias('Server'))

因此,您可以实现与pandas.groupby()相同的逻辑。使用@pandas\u udf在pyspark中应用 这是一种矢量化方法,比简单的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|
+---+----------+----------+-------+-------+
所以,您可以在分组数据中的其他字段之间进行更多计算,并以列表格式将它们添加到数据框中