Scala:size 和 length 的区别

打印 上一主题 下一主题

主题 1904|帖子 1904|积分 5712

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在 Scala 中,size 和 length 都可用于获取集合的元素数量,但它们的适用场景计划意图不同。在 Spark 的 mapValues 示例中使用 size 而非 length,重要与集合范例的底层实现有关:
以一下代码为例,表明
  1.     // 数据转换
  2.     val studentScoresRDD = linesRDD.map { line =>
  3.       val fields = line.split(",")
  4.       (fields(0), fields(2).toDouble)
  5.     }.cache()
  6.     // 任务1:计算总成绩
  7.     val totalScores = studentScoresRDD.reduceByKey(_ + _)
  8.     totalScores.saveAsTextFile(outputPath1)
  9.     // 任务2:计算平均成绩
  10.     val avgScores = studentScoresRDD.groupByKey()
  11.       .mapValues(scores => scores.sum / scores.size)
  12.       .cache()
  13.     avgScores.saveAsTextFile(outputPath2)
复制代码
1. size vs. length 的核心区别

方法适用集合范例实现特点示例length固定长度的集合(如数组、列表)直接返回预存储的长度值,时间复杂度 O(1)Array(1,2,3).length → 3size任意集合(包括可变长度集合)大概需要遍历集合盘算,时间复杂度 O(n)Set(1,2,3).size → 3 2. 为什么 scores.size 是精确的?

在 Spark 的 groupByKey 后,scores 的范例是 Iterable[Double]


  • Iterable 是通用接口,不保证元素数量预先可知(如惰性集合、流数据)。
  • Iterable 仅界说了 size 方法,未界说 length。
示例验证
  1. val scores: Iterable[Double] = List(85.0, 90.0)  // 实际类型取决于groupByKey的实现
  2. scores.size    // ✅ 合法(所有Iterable都有size)
  3. // scores.length  // ❌ 编译错误:length不是Iterable的方法
复制代码
3. 哪些集合用 length?



  • 数组(Array)
    1. val arr = Array(1, 2, 3)
    2. arr.length  // ✅ 推荐(O(1)复杂度)
    3. arr.size    // ✅ 可用(但实际调用的是length)
    复制代码
  • 列表(List)
    1. val list = List(1, 2, 3)
    2. list.length  // ✅ 推荐(O(1)复杂度)
    3. list.size    // ✅ 可用(但实际调用的是length)
    复制代码
4. 哪些集合用 size?



  • Set、Map
    1. val set = Set(1, 2, 3)
    2. set.size    // ✅ 推荐(Set未定义length)
    3. // set.length  // ❌ 编译错误
    4. val map = Map("a" -> 1, "b" -> 2)
    5. map.size    // ✅ 正确
    复制代码
  • 惰性集合(如 Stream)
    1. val stream = Stream.from(1).take(3)
    2. stream.size  // ✅ 计算元素数量(需遍历)
    复制代码
5. Spark 中 groupByKey 返回的范例

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


  • 并行集合:需聚合各分区的元素数量。
  • 迭代器:元素数量需动态盘算(如从外部数据源流式读取)。
6. 最佳实践建议


  • 优先使用 size

    • 对于未知范例的集合(如通用接口 Iterable),统一用 size 制止编译错误。

  • 根据集合范例选择

    • 若明确集合是 Array 或 List,可用 length(性能微优)。
    • 若集合范例不确定(如函数参数为 Iterable),必须用 size。

  • 性能注意事项

    • 对于某些集合(如 Stream),size 大概需要遍历整个集合(O (n)),需审慎使用。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表