当前位置: 首页 > web >正文

Scala:size 和 length 的区别

在 Scala 中,size 和 length 都可用于获取集合的元素数量,但它们的适用场景设计意图不同。在 Spark 的 mapValues 示例中使用 size 而非 length,主要与集合类型的底层实现有关:

以一下代码为例,解释

    // 数据转换val studentScoresRDD = linesRDD.map { line =>val fields = line.split(",")(fields(0), fields(2).toDouble)}.cache()// 任务1:计算总成绩val totalScores = studentScoresRDD.reduceByKey(_ + _)totalScores.saveAsTextFile(outputPath1)// 任务2:计算平均成绩val avgScores = studentScoresRDD.groupByKey().mapValues(scores => scores.sum / scores.size).cache()avgScores.saveAsTextFile(outputPath2)

1. size vs. length 的核心区别

方法适用集合类型实现特点示例
length固定长度的集合(如数组、列表)直接返回预存储的长度值,时间复杂度 O(1)Array(1,2,3).length → 3
size任意集合(包括可变长度集合)可能需要遍历集合计算,时间复杂度 O(n)Set(1,2,3).size → 3

2. 为什么 scores.size 是正确的?

在 Spark 的 groupByKey 后,scores 的类型是 Iterable[Double]

  • Iterable 是通用接口,不保证元素数量预先可知(如惰性集合、流数据)。
  • Iterable 仅定义了 size 方法,未定义 length

示例验证

val scores: Iterable[Double] = List(85.0, 90.0)  // 实际类型取决于groupByKey的实现
scores.size    // ✅ 合法(所有Iterable都有size)
// scores.length  // ❌ 编译错误:length不是Iterable的方法

3. 哪些集合用 length

  • 数组(Array)

    val arr = Array(1, 2, 3)
    arr.length  // ✅ 推荐(O(1)复杂度)
    arr.size    // ✅ 可用(但实际调用的是length)
    
  • 列表(List)

    val list = List(1, 2, 3)
    list.length  // ✅ 推荐(O(1)复杂度)
    list.size    // ✅ 可用(但实际调用的是length)
    

4. 哪些集合用 size

  • Set、Map

    val set = Set(1, 2, 3)
    set.size    // ✅ 推荐(Set未定义length)
    // set.length  // ❌ 编译错误val map = Map("a" -> 1, "b" -> 2)
    map.size    // ✅ 正确
    
  • 惰性集合(如 Stream)

    val stream = Stream.from(1).take(3)
    stream.size  // ✅ 计算元素数量(需遍历)
    

5. Spark 中 groupByKey 返回的类型

groupByKey 返回的是 RDD[(K, Iterable[V])],其中 Iterable 是通用接口,只能用 size
原因
Spark 的分布式环境中,数据可能分布在多个节点,集合的具体实现可能是:

  • 并行集合:需聚合各分区的元素数量。
  • 迭代器:元素数量需动态计算(如从外部数据源流式读取)。

6. 最佳实践建议

  1. 优先使用 size

    • 对于未知类型的集合(如通用接口 Iterable),统一用 size 避免编译错误。
  2. 根据集合类型选择

    • 若明确集合是 Array 或 List,可用 length(性能微优)。
    • 若集合类型不确定(如函数参数为 Iterable),必须用 size
  3. 性能注意事项

    • 对于某些集合(如 Stream),size 可能需要遍历整个集合(O (n)),需谨慎使用。
http://www.xdnf.cn/news/7408.html

相关文章:

  • 深入浅出IIC协议 -- 第二篇:FPGA数字接口设计方法论
  • IEEE Communications Magazine 2025年1-3月论文速览
  • 理解PostgreSQL查询执行计划(三)--复杂操作篇
  • TB开拓者策略交易信号闪烁根因及解决方法
  • flatMap():map + flat 的组合,简化 JavaScript 数组处理逻辑
  • ARMv7的NVIC中断优先级
  • MYSQL8.0常用窗口函数
  • Qt Widgets模块功能详细说明,基本控件:QCheckBox(三)
  • winrar 工具测试 下载 与安装
  • 计算机网络 第三章:运输层(一)
  • mcp 学习第二篇
  • Python在自动驾驶数据清洗中的应用
  • Java后端面试八股文大全(2025最新版)
  • 5月19日复盘-YOLOV4
  • 采用CDN技术时域名解析流程
  • Java-List集合类全面解析
  • DAY 30 模块和库的导入
  • 扫描网络内所有设备的IP地址
  • 专题讨论3:基于图的基本原理实现走迷宫问题
  • (二十二)Java File类与IO流全面解析
  • 第 1 章:数字 I/O 与串口通信(GPIO UART)
  • LeetCode 1306. 跳跃游戏 III(中等)
  • 4.【Linux】Linux工具(2)
  • 小白的进阶之路-人工智能从初步到精通pytorch的基本流程详解-1
  • 树莓派系列教程第八弹:结合 ESP32-CAM 实现远程摄像头监控
  • 14款项目管理工具点评:PingCode、TAPD等哪款更好?
  • Django框架的前端部分使用Ajax请求一
  • bisheng系列(二)- 本地部署(前后端)
  • SpringBoot 中文转拼音 Pinyin4j库 拼音转换 单据管理 客户管理
  • 电脑A和电脑B都无法ping通电脑C网络,电脑C可以ping通电脑A和B,使用新系统测试正常,排除硬件问题。