You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用reduceByKey计算纽约州月度阳性率并格式化输出结果

纽约州月度新冠阳性率计算(Spark RDD实现)

基于给定的纽约州各县新冠数据拉取代码,可通过以下步骤完成月度阳性率的计算与格式化展示:

核心步骤

  1. 转换数据结构:从原始RDD中提取**年月(yyyy-MM)**作为分组键,将当日新增病例数和检测数封装为二元组作为聚合值。
  2. 全州月度数据聚合:使用reduceByKey按年月汇总全州每月的总阳性病例数和总检测数。
  3. 计算并格式化阳性率:通过总病例数/总检测数*100得到阳性率,利用Math.round处理为保留两位小数的百分比(先乘10000取整再除以100,避免精度丢失)。
  4. 排序与结果收集:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:35:20