2017-07-19 142 views
1

计算收入贡献我有一个表像这样使用SQL火花

item   mrp 
-----  ----- 
burger  500 
burger  500 
burger  600 
pizza  1000 
pizza  1000 
pizza  1000 

我需要计算汉堡包和比萨饼的收入贡献。一种方法是首先获取单个项目的mrp总数并存储在一个变量中,然后获得所有项目的总mrp总和,并进行分割。但是这需要遍历单个项目。我想用闪光的方式使用sql来完成它。是否有可能或我必须选择looping路径

回答

1

您需要使用groupby和agg。

首先你总结了所有的MRP:

import org.apache.spark.sql.functions._ 
val sumOfAll = df.agg(sum($"mrp")).collect()(0).getLong(0) 

的AGG功能允许您聚集。总和函数(来自sql.functions)总结了mrp列中的所有值。这导致了一行一列的数据框(只是总和)。所以我们把它收集到驱动程序中,取第一个元素(理论上可能有多行,但我们只知道第一个元素是相关的),这会导致一行,然后我们将第一列作为长整型。

val groupedDF = df.groupBy("item").agg(sum($("mrp")/lit(sumOfAll)) 

groupBy告诉我们按项目进行agg计算。我们还将总和列除以前的sumOfAll(点亮是文字,对所有行使用相同的值)

查看结果您可以使用show(查看)或collect(获取和执行某些操作它)

+0

你可以写它的Java等效? 当前我正在使用'数据集 totalqty = spark.sql(“select icode,bround(cast(long(total_amount)long)/(从bigmart.o_sales中选择cast(sum(total_amount) )as mrp from bigmart.o_sales group by icode“);' 这是帮助我,但你的代码似乎很整洁 – Saurab