2017-07-19 197 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