解决scala.collection.mutable.Map写入的问题
在scala中可变Map写入
使用
val no2ID = scala.collection.mutable.Map[Int,String]() no2ID += (1 -> "something")
而在以下代码中,Map不能添加元素
val no2ID = scala.collection.mutable.Map[Int,String]() sc.textFile(conf).foreach(line=>{ val splits = line.split(“,”) val no = splits(0).trim.toInt val ID = splits(1) no2ID += (no -> ID) })
其中conf文件为数字和对应的人名
把RDD使用collect转化成Array后,可以向Map添加元素
val no2ID = scala.collection.mutable.Map[Int,String]() sc.textFile(conf).collect().foreach(line=>{ val splits = line.split(“,”) val no = splits(0).trim.toInt val ID = splits(1) no2ID += (no -> ID) })
scala中的Map使用例子
Map结构是一种非常常见的结构,在各种程序语言都有对应的api,由于Spark的底层语言是Scala,所以有必要来了解下Scala中的Map使用方法。
(1)不可变Map
特点:
api不太丰富
如果是var修饰,引用可变,支持读写
如果是val修饰,引用不可变,只能写入一次值,其后只读
var a:Map[String,Int]=Map("k1"->1,"k2"->2)//初始化构造函数 a += ("k3"->3)//添加元素 a += ("k4"->4)//添加元素 a += ("k1"->100)//已经存在添加元素会覆盖 a -= ("k2","k1")//删除元素 // a("k1") = "foo"//不支持 println(a.contains("k6"))//是否包含某元素 println(a.size)//打印大小 println(a.get("k1").getOrElse("default")) //根据key读取元素,不存在就替换成默认值 a.foreach{case (e,i) => println(e,i)} //遍历打印1 for( (k,v)<-a ) println(k,v) //遍历打印2 println(a.isEmpty)//判断是否为空 a.keys.foreach(println)//只打印key a.values.foreach(println)//只打印value a=Map()//数据清空使用再次new println(a.size) a.toSeq.sortBy(_._1)//升序排序 key a.toSeq.sortBy(_._2)//升序排序 value a.toSeq.sortWith(_._1>_._1) //降序排序 key a.toSeq.sortWith(_._2>_._2) //降序排序 value //下面自定义按英文字母或数字排序 implicit val KeyOrdering=new Ordering[String] { override def compare(x: String, y: String): Int = { x.compareTo(y) } } println(a.toSeq.sorted)
(2)可变Map例子
特点:
api丰富与Java中Map基本类似
如果是var修饰,引用可变,支持读写
如果是val修饰,引用不可变,支持读写
def map3(): Unit ={ //不可变Map+var关键词修饰例子 var a:scala.collection.mutable.Map[String,Int]=scala.collection.mutable.Map("k1"->1,"k2"->2)//初始化构造函数 a += ("k3"->3)//添加元素 a += ("k4"->4)//添加元素 a += ("k1"->100)//已经存在添加元素会覆盖 a += ("k1"->100,"k9"->9)//添加多个元素 a -= ("k2","k1")//删除元素 a ++= List("CA" -> 23, "CO" -> 25)//追加集合 a --= List("AL", "AZ")//删除集合 a.retain((k,v)=> k=="k1")//只保留等于k1元素,其他的删除 a.put("put1",200)//put a.remove("k2")//remove a.clear()//清空 a("k3")=100//支持 println(a.contains("k6"))//是否包含某元素 println(a.size)//打印大小 println(a.get("k1").getOrElse("default")) //根据key读取元素,不存在就替换成默认值 a.foreach{case (e,i) => println(e,i)} //遍历打印1 for( (k,v)<-a ) println(k,v) //遍历打印2 println(a.isEmpty)//判断是否为空 a.keys.foreach(println)//只打印key a.values.foreach(println)//只打印value a=scala.collection.mutable.Map()//引用能变 println(a.size) a.toSeq.sortBy(_._1)//排序 key a.toSeq.sortBy(_._2)//排序 value a.toSeq.sortWith(_._1>_._1) //降序排序 key a.toSeq.sortWith(_._2>_._2) //降序排序 value //下面自定义按英文字母或数字排序 implicit val KeyOrdering=new Ordering[String] { override def compare(x: String, y: String): Int = { x.compareTo(y) } } println(a.toSeq.sorted) }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
使用ElasticSearch6.0快速实现全文搜索功能的示例代码
本篇文章主要介绍了使用ElasticSearch6.0快速实现全文搜索功能,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-02-02Java中字符串String的+和+=及循环操作String原理详解
Java编译器在编译时对String的+和+=操作会创建StringBuilder对象来进行字符串的拼接,下面这篇文章主要给大家介绍了关于Java中字符串String的+和+=及循环操作String原理的相关资料,需要的朋友可以参考下2023-01-01部署springboot项目到云服务器的两种方式(jar+war)
本文主要介绍了部署springboot项目到云服务器的两种方式,主要介绍了jar和war两种方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2021-12-12SpringBoot整合mybatisplus和druid的示例详解
这篇文章主要介绍了SpringBoot整合mybatisplus和druid的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-08-08
最新评论