spark中的透視函數pivot


透視函數其實就是我們excel中常用的數據透視表相似,先來看個例子。

以下是准備的數據源,數據是電商系統中用戶的行為數據(瀏覽,收藏,加購,成交,評分等),score為統計次數。

對應的字段分別為 租戶id,用戶id,商品編碼Id,行為事件代碼,當日統計次數,統計日期。

 

現在我們要轉換成目標的數據是 租戶中每個用戶的所有行為記錄在一行能夠展示,直觀點看下圖。

對應的字段是 租戶Id,用戶id,商品id,加購,瀏覽,收藏,評分,成交

 

 

了解了需求以后,我們來看實際的開發如下:

先獲取數據源:

val eventRDD = spark.sql("select tenantId,userId,spuId,eventCode,score,dt from dws.dws_user_event_stat")

 然后進行轉換,以下可以理解為:

groupBy: 對 tenantId,userId,spuId 進行分組

pivot: 對eventCode進行透視,

sum: 對score進行求和,

na.fill(0): 最后對空值進行處理,空值默認填充0.

 val userEventScore = eventRDD.groupBy("tenantId","userId","spuId")
            .pivot("eventCode")
            .sum("score").na.fill(0)

性能優化:

為了使性能達到最優,需要指定透視列對應的不同值,即指定eventCode包含的具體的值有哪些放到一個Seq中。

 val userEventScore = eventRDD.groupBy("tenantId","userId","spuId")
            .pivot("eventCode",Seq("goodsCart","goodsView","goodsFavorite","goodsRate","orderTrade"))
            .sum("score").na.fill(0)

最后輸出的結果如上面截圖所示。

 

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM