透視函數其實就是我們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)
最后輸出的結果如上面截圖所示。