python - 如何在 PySpark DataFrame 中的 GroupBy 和聚合之后传递第三方列?
问题描述
我有一个 Spark DataFrame,比如说df
,我需要对其应用一个 GroupBy col1
,通过最大值聚合col2
并传递对应的值col3
(这与 groupBy 或聚合无关)。最好用一个例子来说明它。
df.show()
+-----+-----+-----+
| col1| col2| col3|
+-----+-----+-----+
| 1| 500| 10 |
| 1| 600| 11 |
| 1| 700| 12 |
| 2| 600| 14 |
| 2| 800| 15 |
| 2| 650| 17 |
+-----+-----+-----+
我可以很容易地执行groupBy
和聚合以获得每个组的最大值col2
,使用
import pyspark.sql.functions as F
df1 = df.groupBy("col1").agg(
F.max("col2").alias('Max_col2')).show()
+-----+---------+
| col1| Max_col2|
+-----+---------+
| 1| 700|
| 2| 800|
+-----+---------+
但是,我正在努力并且想要做的是另外传递 的相应值col3
,从而获得下表:
+-----+---------+-----+
| col1| Max_col2| col3|
+-----+---------+-----+
| 1| 700| 12 |
| 2| 800| 15 |
+-----+---------+-----+
有谁知道如何做到这一点?
提前谢谢了,
马里安萨斯
解决方案
您可以聚合一个结构的最大值,然后扩展该结构:
import pyspark.sql.functions as F
df2 = df.groupBy('col1').agg(
F.max(F.struct('col2', 'col3')).alias('col')
).select('col1', 'col.*')
df2.show()
+----+----+----+
|col1|col2|col3|
+----+----+----+
| 1| 700| 12|
| 2| 800| 15|
+----+----+----+
推荐阅读
- python - 带有xml的jinja2不呈现
- vue.js - coreui-vue - Vue Carousel 不会自动运行?
- sql - 在每行的两个日期之间计数
- arrays - 如何从 React 上的 API 映射 JSON 文件,选择要添加到产品详细信息选择器上的值
- yaml - GitHub 上的 YAMLException 在第 20 行说“映射条目的缩进错误”
- python - Django:如何将两个或多个 FBV 渲染到一个模板中
- google-sheets - 通过 google-sheets 中的 xpath 在网站中搜索字符串后获取下一个文本的值
- ecmascript-6 - 转译 node-fetch 要求返回错误
- javascript - 如何使用 for 循环或数组填充 angularjs 列表?
- phaser-framework - 我怎样才能只放一次炸弹,直到它在物理街机池中爆炸?