当我像这样使用DataFrame groupby时:
df.groupBy(df("age")).agg(Map("id"->"count"))
我只会得到一个包含"age"和"count(id)"列的DataFrame,但是在df中,还有许多其他列,例如"name".
总而言之,我希望得到MySQL中的结果,
"按年龄从df组中选择姓名,年龄,计数(id)"
在Spark中使用groupby时我该怎么办?
总的来说,一般来说,您必须将聚合结果与原始表连接起来.Spark SQL遵循与大多数主要数据库(PostgreSQL,Oracle,MS SQL Server)相同的pre-SQL:1999约定,它不允许在聚合查询中使用其他列.
因为对于像计数结果这样的聚合没有很好地定义,并且在支持这种类型的查询的系统中行为往往会有所不同,所以您可以使用任意聚合(如first
或)来包含其他列last
.
在某些情况下,您可以agg
使用select
窗口函数和后续替换,where
但根据上下文,它可能非常昂贵.
在执行groupBy之后获取所有列的一种方法是使用join函数.
feature_group = ['name', 'age'] data_counts = df.groupBy(feature_group).count().alias("counts") data_joined = df.join(data_counts, feature_group)
data_joined现在将包含所有列,包括计数值.