2016-12-19 61 views
0

如果我有一組看起來不同的項目如下星火SQL找到一個組中最常見的項目

case class Order(orderId: String, orderDetails: OrderDetail, destination: String) 
case class OrderDetail(date: Timestamp, recipient: String, item: String) 

grouped = ordersDF.groupby($"destination") 

什麼IM找是找到每個目的地最常見的項目望着方式可用於聚合的sql函數,我沒有看到數據上的子組groupBys。將數據轉化爲RDD可行,但我的理解是,這不是最佳實踐。

我想看到類似

|Destination | mostCommon | 
---------------------------- 
|XYZ   |item x  | 

回答

2

你可以使用GROUPBY /聚集功能和窗口功能的組合實現這一目標。

我們認爲這是ordersDf:

+-------+--------------+-----------+ 
|orderId| orderDetails|destination| 
+-------+--------------+-----------+ 
|  1|[11,abc,item1]|  loc1| 
|  2|[12,abc,item2]|  loc1| 
|  3|[13,abc,item1]|  loc1| 
|  4|[14,abc,item1]|  loc2| 
|  5|[15,abc,item2]|  loc2| 
|  6|[11,abc,item2]|  loc2| 
|  7|[11,abc,item2]|  loc2| 
+-------+--------------+-----------+ 

首先,按目的地和項目的數據並計算每個項目的頻率。

val dfWithCount = ordersDf 
.groupBy("destination","orderDetails.item") 
.agg(count("orderDetails.item").alias("itemCount")) 

聚集的數據幀,然後看起來像這樣

+-----------+-----+---------+ 
|destination| item|itemCount| 
+-----------+-----+---------+ 
|  loc1|item2|  1| 
|  loc2|item1|  1| 
|  loc2|item2|  3| 
|  loc1|item1|  2| 
+-----------+-----+---------+ 

因爲我們想找出每個位置最常見的項目,讓我們分區的目的,並通過ITEMCOUNT列應用最大聚集。

val maxWindowSpec = Window.partitionBy("destination") 
val maxColumn = max($"itemCount").over(maxWindowSpec) 
val dfWithMax = dfWithCount.withColumn("maxItemCount",maxColumn) 

得到的數據幀具有每個目的地的項目無論是itemCounts和MAXCOUNT

+-----------+-----+---------+------------+ 
|destination| item|itemCount|maxItemCount| 
+-----------+-----+---------+------------+ 
|  loc1|item2|  1|   2| 
|  loc1|item1|  2|   2| 
|  loc2|item1|  1|   3| 
|  loc2|item2|  3|   3| 
+-----------+-----+---------+------------+ 

最後,我們篩選出列,其中ITEMCOUNT對於給定的(目標,項目)的組合是不是最大的項目數爲那個目的地。

val result = dfWithMax 
.filter("maxItemCount - itemCount == 0") 
.drop("maxItemCount","itemCount") 

result.show() 

+-----------+-----+ 
|destination| item| 
+-----------+-----+ 
|  loc1|item1| 
|  loc2|item2| 
+-----------+-----+ 
相關問題