業務需要:
根據歷史庫存 預測未來某時間內庫存
算法需求:
1. 統計歷史3年內的庫存量
2. 將庫存划分為 平穩流量 和 波動(異常)流量
實際情況:
1. 每天數據量過億
2. 每天細分維度小於10萬
3. 數據中存在 時間斷點
4. 嘗試按月批次直接處理,過程較慢
回歸正題,數據需要 按 各細分維度 計算異常,平穩,填充時間斷點,
第一感覺,分組,然后對組內數據處理,
一頓百度 , 發現 groupByKey 可以按 key(某幾個字段分組),然后使用flatMapGroups 對組內數據 單獨處理
df2.groupByKey(row => { (row.getAs[](""),row.getAs[]("")) }).flatMapGroups((key, it) => { ArrayBuffer[(String/**/,String/**/)]() }) }
一頓操作,本地ok
放入生產,集群環境,頓時懵了,結果完全不對。。。
懷疑executor導致問題,先添加日志
神奇是事情發生了,groupByKey之前數據是按時間排序了,然而,flatMapGroups 之后顯示順序完全錯亂
百度無果,無奈
只能在flatMapGroups 開始先 進行排序
ArrayBuffer.sortBy(row=>(row._1))
到此問題解決。
spark新人一枚,記以做提醒。
此外發現領導給出的模板中 可以使用
val df = dataFrame.repartition(dataFrame.col(""))
然后使用
df.flatMap(row=>{ ArrayBuffer[(String/**/,String/**/)]() })
在集群環境同樣會帶來亂序問題,后續將尋找flatMap亂序的原因.