使用reduceByKey计算纽约州月度阳性率并格式化输出结果
纽约州月度新冠阳性率计算(Spark RDD实现)
基于给定的纽约州各县新冠数据拉取代码,可通过以下步骤完成月度阳性率的计算与格式化展示:
核心步骤
- 转换数据结构:从原始RDD中提取**年月(yyyy-MM)**作为分组键,将当日新增病例数和检测数封装为二元组作为聚合值。
- 全州月度数据聚合:使用
reduceByKey按年月汇总全州每月的总阳性病例数和总检测数。 - 计算并格式化阳性率:通过总病例数/总检测数*100得到阳性率,利用
Math.round处理为保留两位小数的百分比(先乘10000取整再除以100,避免精度丢失)。 - 排序与结果收集:使用
sortBy按年月升序排序,最后用collect将分布式结果拉取到本地展示。
完整代码实现
// 基于给定的data_rdd继续处理 val monthlyStatsRDD = data_rdd // 提取年月作为key,(新增病例数, 检测数)作为value .map { case (date, _, cases, tests) => val yearMonth = date.slice(0, 7) // 从yyyy-MM-dd中截取yyyy-MM (yearMonth, (cases, tests)) } // 按年月聚合,汇总每月总病例和总检测数 .reduceByKey { case ((totalCases1, totalTests1), (totalCases2, totalTests2)) => (totalCases1 + totalCases2, totalTests1 + totalTests2) } // 计算阳性率并格式化保留两位小数 .map { case (yearMonth, (totalCases, totalTests)) => val positivityRate = if (totalTests == 0) 0.0 else (totalCases.toDouble / totalTests) * 100 // 保留两位小数:先乘100取整后再除以100 val roundedRate = Math.round(positivityRate * 100.0) / 100.0 (yearMonth, roundedRate) } // 按年月升序排序 .sortBy(_._1) // 收集并打印结果 monthlyStatsRDD.collect().foreach(println)
预期输出示例
(2020-03,37.89) (2020-04,31.79) (2020-05,5.34) (2020-06,1.2) (2020-07,1.08) (2020-08,0.83) (2020-09,0.97) (2020-10,1.3) (2020-11,2.98) (2020-12,5.65) (2021-01,6.27) (2021-02,3.66) (2021-03,3.35) (2021-04,2.69) (2021-05,1.09) (2021-06,0.42) (2021-07,1.56) (2021-08,3.15) (2021-09,2.9) (2021-10,2.31) (2021-11,3.55) (2021-12,10.54) (2022-01,15.09) (2022-02,2.93) (2022-03,1.95) (2022-04,5.45) (2022-05,7.87) (2022-06,5.88) (2022-07,9.54) (2022-08,7.08) (2022-09,6.94) (2022-10,6.71)
内容的提问来源于stack exchange,提问作者cappy
相关产品推荐
相关产品推荐

