如何计算火花中组的百分比



我有以下形式的数据:

FUND|BROKER|QTY
F1|B1|10
F1|B1|50
F1|B2|20
F1|B3|20

当我按基金和经纪人分组时,我想计算数量占集团级别总数的百分比。这样

FUND|BROKER|QTY %|QTY EXPLANATION
F1|B1|60%|(10+50)/(10+50+20+20)
F1|B2|20%|(20)/(10+50+20+20)
F1|B2|20%|(20)/(10+50+20+20)

或者当我只按基金分组时,就像这样

FUND|BROKER|QTY %|QTY EXPLANATION
F1|B1|16.66|(10)/(10 + 50)
F1|B1|83.33|(50)/(10 + 50)
F1|B2|100|(20)/(20)
F1|B3|100|(20)/(20)

如果可能的话,我想使用 spark-sql 或通过数据帧函数来实现这一点。

我想我必须使用窗口函数,这样我才能访问分组数据集的总数,但我没有太多运气以正确的方式使用它们。

Dataset<Row> result = sparkSession.sql("SELECT fund_short_name, broker_short_name,first(quantity)/ sum(quantity) as new_col FROM margin_summary group by fund_short_name, broker_short_name" );

PySpark SQL 解决方案。

这可以使用sum作为定义 2 个窗口的窗口函数来完成 - 一个窗口对经纪人、基金进行分组,另一个仅对基金进行分组。

from pyspark.sql import Window
from pyspark.sql.functions import sum
w1 = Window.partitionBy(df.fund,df.broker)
w2 = Window.partitionBy(df.fund)
res = df.withColumn('qty_pct',sum(df.qty).over(w1)/sum(df.qty).over(w2))
res.select(res.fund,res.broker,res.qty_pct).distinct().show()

编辑:结果 2 更简单。

res2 = df.withColumn('qty_pct',df.qty/sum(df.qty).over(w1))
res2.show()

SQL解决方案将是

select distinct fund,broker,100*sum(qty) over(partition by fund,broker)/sum(qty) over(partition by fund)
from tbl

是的。当你说你需要使用窗口分析函数时,你是对的。请在下面找到您查询的解决方案。

希望对您有所帮助!

spark.read.option("header","true").option("delimiter","|").csv("****").withColumn("fundTotal",sum("QTY").over(Window.partitionBy("FUND"))).withColumn("QTY%",sum("QTY").over(Window.partitionBy("BROKER"))).select('FUND,'BROKER,(($"QTY%"*100)/'fundTotal).as("QTY%")).distinct.show

第二个!

spark.read.option("header","true").option("delimiter","|").csv("/vihit/data.csv").withColumn("QTY%",sum("QTY").over(Window.partitionBy("BROKER"))).select('FUND,'BROKER,(('QTY*100)/$"QTY%").as("QTY%")).distinct.show

最新更新