最近在用spark處理資料的時候,遇到了這樣一種需求:
我想統計每個城市在工作日和周末早高峰、晚高峰、夜高峰和普通時間段的訂單數,并且早高峰、晚高峰、夜高峰和普通時間段分别占一列。
原始檔案CSV檔案的内容如下圖所示:
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")
簡單高效有木有,最終效果展現如下,滿足了我的需求。