天天看點

Spark小技巧之pivot

最近在用spark處理資料的時候,遇到了這樣一種需求:

我想統計每個城市在工作日和周末早高峰、晚高峰、夜高峰和普通時間段的訂單數,并且早高峰、晚高峰、夜高峰和普通時間段分别占一列。

原始檔案CSV檔案的内容如下圖所示:

Spark小技巧之pivot

peak_type代表時間段,其中morning_peak代表早高峰、evening_peak代表晚高峰、nignt_peak代表夜高峰、normal代表正常時間段。

這個問題的實質就是想将某列不同的值轉化為不同的列的問題。

解決這種問題最傳統的方式就是對peak_type不同值分别進行處理,然後進行join操作,但是這種解決辦法相當複雜并且代碼量大,于是想看看有沒有别的更好的辦法,通過網上搜尋,發現了一個叫做pivot的東西。

透視(pivot)資料功能是Spark 1.6的衆多新增特性之一,它通過使用DataFrame(目前支援Scala、Java和Python語言)建立透視表(pivot table)。透視可以視為一個聚合操作,通過該操作可以将一個(實際當中也可能是多個)具有不同值的分組列轉置為各個獨立的列。

看到pivot這個功能,大喜,迫不及待使用,隻用一行代碼就可以搞定:

  csv.groupBy("city_id","date_type").pivot("peak_type").sum("order_num")

Spark小技巧之pivot

簡單高效有木有,最終效果展現如下,滿足了我的需求。

繼續閱讀