spark groupByKey flatMapGroups初试
业务需要:
根据历史库存 预测未来某时间内库存
算法需求:
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乱序的原因.