当前位置: 首页 > 知识库问答 >
问题:

使用Spark DataFrame groupby时如何获取其他列?

朱季
2023-03-14

当我像这样使用DataFrame groupby时:

df.groupBy(df("age")).agg(Map("id"->"count"))

我只会得到一个列为“age”和“count(id)”的DataFrame,但在df中,还有许多其他列,如“name”。

总之,我想得到MySQL中的结果,

“按年龄从df组中选择姓名、年龄、计数(id)”

在Spark中使用groupby时该怎么办?

共有3个答案

鲜于峰
2023-03-14

也许这个解决方案会有帮助。

from pyspark.sql import SQLContext
from pyspark import SparkContext, SparkConf
from pyspark.sql import functions as F
from pyspark.sql import Window

    name_list = [(101, 'abc', 24), (102, 'cde', 24), (103, 'efg', 22), (104, 'ghi', 21),
                 (105, 'ijk', 20), (106, 'klm', 19), (107, 'mno', 18), (108, 'pqr', 18),
                 (109, 'rst', 26), (110, 'tuv', 27), (111, 'pqr', 18), (112, 'rst', 28), (113, 'tuv', 29)]

age_w = Window.partitionBy("age")
name_age_df = sqlContext.createDataFrame(name_list, ['id', 'name', 'age'])

name_age_count_df = name_age_df.withColumn("count", F.count("id").over(age_w)).orderBy("count")
name_age_count_df.show()
+---+----+---+-----+
| id|name|age|count|
+---+----+---+-----+
|109| rst| 26|    1|
|113| tuv| 29|    1|
|110| tuv| 27|    1|
|106| klm| 19|    1|
|103| efg| 22|    1|
|104| ghi| 21|    1|
|105| ijk| 20|    1|
|112| rst| 28|    1|
|101| abc| 24|    2|
|102| cde| 24|    2|
|107| mno| 18|    3|
|111| pqr| 18|    3|
|108| pqr| 18|    3|
+---+----+---+-----+
林和畅
2023-03-14

执行groupBy后获取所有列的一种方法是使用join函数。

feature_group = ['name', 'age']
data_counts = df.groupBy(feature_group).count().alias("counts")
data_joined = df.join(data_counts, feature_group)

data\u joined现在将包含所有列,包括计数值。

乐正翰
2023-03-14

长话短说,一般来说,您必须将聚合结果与原始表连接起来。SparkSQL遵循与大多数主要数据库(PostgreSQL、Oracle、MSSQLServer)相同的SQL: 1999约定,不允许在聚合查询中添加其他列。

由于对于像count这样的聚合,没有很好地定义结果,并且在支持这种类型查询的系统中,行为往往会有所不同,因此您可以使用任意聚合,如first或last,来包含额外的列。

在某些情况下,您可以使用窗口函数和后续的where替换agg,但这可能会非常昂贵,具体取决于上下文。

 类似资料:
  • 问题内容: 假设我在first.com中说一个用户设置了一个cookie。现在,我想通过javascript和ajax在second.com中读取该cookie。但这不起作用。我有xmlHttp.status = 0。 样例代码 在第二个域的readcookie.php文件中 在第一个域cookie.php文件中 问题答案: 您无法从其他域读取Cookie-结尾。 我能想到的唯一方法是将一些代码添

  • 问题内容: 如何获取位于其他站点上的某个html元素的html? 解: 问题答案: 对php或任何其他文件进行ajax调用,使用CURL或其他工具抓取所需的页面,提取div并回显它,然后当您取回html时,将其放在页面的div中

  • 我有2个插件A和b。我在Require-Bundle部分有插件B。但是当我试图从A类中获取B的资源时 我得到null。如果我把B的资源(文件夹)放在A的根目录上,一切都像一个魅力。我错过了什么吗? 注:我读了拉尔斯·沃格尔的文章 ^这个解决方案在我从eclipse运行插件时有效,但当我将插件打包到jar并尝试从本地更新站点安装时 附言:我也读过几个关于堆栈溢出的相关问题,但无法找到答案: Java

  • 我想在发布项目的帖子中显示用户的名字。但是它显示错误:试图在视图文件中获得非对象的属性。 我有用户表和项目表。在项目表中,我有外键user_id。但我无法从user表访问用户名,甚至无法访问用户id。在项目表中,用户id为0,与用户表中的不同。我该如何解决这个问题? 用户模型: 项目模型: 迁移用户表: 迁移项目表: 查看文件:

  • 我如何通过我自己的API从另一个API获取PDF,然后到前面供用户下载。 我现在得到的只是一张空白页。 后面是Scala的,当我打印文件时,我得到一个字符串。

  • 问题内容: 如果有人熟悉css和Material UI,对此将提供任何帮助。基本上,我试图实现一个Material UI Drawer组件,该组件在打开时不仅会滑出页面内容的顶部,而且页面内容会在抽屉周围保持一致,即挤压或扩展。我在项目中使用引导行和容器,但是我不知道如何使用它们来实现此目的。这是我的组件的布局方式: 请注意,“ top”属性仅是因为我希望在打开或关闭抽屉时,应用栏的顶部标题区域保