python - pyspark 行总和以根据 groupby 中另一列中的值获取一个新行
问题描述
有一个包含用户、位置、值的数据框。目前,美国相关位置在一个用户的不同行中:
user location values
209 OH_US 45
O09 PA_US 30
O09 AQ 10
209 CA_US 50
209 UK 10
....
对于每个想要生成一个新行来用总和替换美国相关位置的用户,位置名称是“US”。删除美国不同州的这些行。预期结果如下所示:
user location values
209 US 200
209 UK 10
O09 US 300
O09 AQ 10
...
目前我正在考虑将所有与美国相关的行拉到一个单独的数据框中以在 groupby 中进行求和,然后在原始数据框中删除与美国相关的所有行以加入美国求和数据框。
有没有更有效的方法来做到这一点?
解决方案
嗨,我们可以用多种方法在 pyspark 中解决这个问题吗
- 使用 spark.sql -
df.createOrReplaceTempView("SAMPLE_TABLE") df.createOrReplaceTempView("SAMPLE_TABLE") df2=spark.sql("SELECT user , case when location like '%_US' then 'US' else location end Location , SUM(VALUES) VALUES from SAMPLE_TABLE group by user , case when location like '%_US' then 'US' else location end ") df2.show()
使用 pyspark api
import pyspark.sql.functions as F df.groupby(F.when(F.col('location').\ like("%_US"),"US").\ otherwise(F.col("location")).\ alias('location'))\ .agg(F.sum('values').alias("values"))\ .show()
推荐阅读
- java - 为什么@EnableWs 从 spring bean 中删除了 aop 代理
- javascript - 我需要做什么才能创建幻灯片
- java - 在 JAVA 中显示格式 XX:00
- asp.net-mvc - 将模型传递给局部视图不起作用
- java - 没有找到 org.apache.http.annotation.NotThreadSafe 的类文件,我该如何在 intellij idea 上修复它?
- c# - string.split 从大字符串中解析 url
- angular - 如何使用 *ngFor 指令从 Ionic 3(Cordova、Ionic 3、Angular 5)上的存储中获取数据
- python - 以不同的顺序将日期时间转换为 UTC
- fortran - Fortran arctan 子例程未按预期工作
- ios - 无法让 API 调用及时运行 tableview swift 4 xcode 9