`
qindongliang1922
  • 浏览: 2147473 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:116328
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:124593
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:58457
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:70354
社区版块
存档分类
最新评论

使用Scala的强大api快速加工数据

阅读更多

Scala是一门高级的,非常灵活和强大的函数式编程语言,既支持类型严格,语义明确的面向对象的编程风格,也支持类型多变,写法风骚的函数式编码。

Scala中封装了许多有用强大的api,使我们处理数据更加方便,当然Java8以后也支持了一些函数式编程的写法的语法糖,终于能使雍容的java代码精简不少,有名的开源框架如Spark,Kafka,Filnk也都是使用Scala编写的,感兴趣的朋友可以学习一下。

今天来看一个使用Scala处理集合数据的一个小案例:

先看几条例子数据:
班级id 学校id   英雄id  英雄姓名  英雄年龄
c1	s1	1001	张飞	35
c2	s3	1002	高渐离	18
c2	s2	1004	杨戬	25
c2	s4	1005	吕布	36
c3	s1	1006	李白	23


需求就是将如上强势开黑英雄阵容的数据按班级分类,然后每个班级下面可快速通过英雄id(唯一)查询到该英雄,其实思路很明确,只要加工成一个2级map的结构即可,如下:
Map[String,Map[String,Hero]]=Map[班级id,[英雄id,英雄信息]]


我们先看下,造的数据源的几行代码:



  //定义一个case类    
  /***
    * 
    * @param classId 班级id
    * @param schoolId 学校id
    * @param heroId 英雄id
    * @param heroName 英雄名称
    * @param age 年龄
    */
  case class Hero(classId:String,schoolId:String,heroId:String,heroName:String,age:Int){
    override def toString:
    String =
      classId+
      "\t"+schoolId+
      "\t"+heroId+
      "\t"+heroName+
      "\t"+age
  }


    //构建5个英雄的数据
    val s1=Hero("c1","s1","1001","张飞",35)
    val s2=Hero("c2","s3","1002","高渐离",18)
    val s3=Hero("c2","s2","1004","杨戬",25)
    val s4=Hero("c2","s4","1005","吕布",36)
    val s5=Hero("c3","s1","1006","李白",23)

    //将如上强势开黑英雄阵容的数据按班级分类,然后每个班级下面可快速通过英雄id查询到该英雄
    val array=Array(s1,s2,s3,s4,s5)



上面的代码首先定义了一个case类,并重写了其tostring方法,紧接着又构建了一套开黑阵容的英雄的数据,最终将其放在一个数组中,下面看下核心的处理方法:


`   //定义一个存储最终结果的Map结构
    var search_map:Map[String,Map[String,Hero]]=Map()
    //先按班级id分组,并将数据转化成Map结构
    val map:Map[String,Array[Hero]]=array.groupBy(_.classId)
    //再将数据最终的存储结果即可
    map.foreach(kv=>{
      search_map += ( kv._1 -> kv._2.map(hero=>hero.heroId->hero).toMap )
    })


上面的代码就是加工的核心代码,其实只有后面两行才是最核心的,第一行我们首先定义了一个最终的存储结构,然后接着我们对数组进行分组,得到了一个初步的按班级分组的map结构的数据,但是这个map并不是我们想要的,因为它仅仅了提供了班级的映射的数据,如果我们将获取某个班级下的某个英雄的数据,还得遍历整个班级的数据才能找到,所以我们又在第三步对班级的数据做了一个转化,将其原来是Array[Hero]的数据结构,转成了Map[String,Hero]结构,通过Hash表的数据结果,我们能快速定位某个英雄的数据。

下面分析下第三段代码的意思,第二段代码其实比较容易理解就是对数组元素进行按班级分组,返回的结果就是每一个班级,对应一个班级的集合数据,第三段代码核心是下面的这一句:
( kv._1 -> kv._2.map(hero=>hero.heroId->hero).toMap )


前面的+=是追加数据到map集合里面,后面的代码其实里面隐藏了一个个匿名函数:
hero=>hero.heroId->hero

scala里面的map方法的参数是一个函数,首先我们通过map方法,遍历Array[Hero]里面的每一个英雄的数据,然后通过上面代码的这个匿名函数,将生成一个Iterator[(k,v)]数据结构,最终调用toMap方法,将这个集合数据转化成map即可。

在scala里面Map里面一个集合的元素,表示如下:
(k1->v1)
(k2->v2)
(k3->v3)

所以,下面的代码其实就是最终结果的存储的一个kv对内容:
(   kv._1    ->   kv._2.map(hero=>hero.heroId->hero).toMap   )


最后我们来打印下,结果集的数据:
    search_map.foreach(hero=>{
      println("班级id:"+hero._1+" 班级人数:"+hero._2.size)
      hero._2.values.foreach(h=>println(h))
      println("=================================\n")
    })


输出结果如下:
班级id:c1 班级人数:1
c1	s1	1001	张飞	35
=================================

班级id:c3 班级人数:1
c3	s1	1006	李白	23
=================================

班级id:c2 班级人数:3
c2	s3	1002	高渐离	18
c2	s2	1004	杨戬	25
c2	s4	1005	吕布	36
=================================


看到结果是没问题的,scala里面提供了非常多的这点常见的功能强大的api,这一点搞过spark开发的人应该都有体会,里面关于rdd操作的众多方法都与scala的原生的api非常功能非常类似,用起来非常方便。

有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
0
1
分享到:
评论

相关推荐

    scala 2.13.3 API 文档 Html离线版 scala-api.rar

    最新制作 scala 2.13.3 API 文档 Html离线版 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在 Java 虚拟机上,并兼容现有的 Java 程序。

    spark-scala-api

    spark-scala-api zip压缩包

    scala2.8 api

    scala 2.8 api 文档 chm格式

    jassh, 在远程服务器上,高级 Scala SSH API用于轻松和快速操作.zip

    jassh, 在远程服务器上,高级 Scala SSH API用于轻松和快速操作 JASSH - Scala SSH API 高级 Scala SSH API,用于远程服务器上的轻松和快速操作。这个API是基于 JSCH的。 接口稳定。提供许多 helper 函数以简化unix...

    Scala 2.11 API.chm

    Scala 2.11 API.chm , 根据最新的scala安装API制作的CHM文档,但是并不能搜方法,这个是scala的一大遗憾

    Scala-API-2.12.7(离线网页版)

    Scala是一门多范式可伸缩的编程语言,它既涵盖了Java、Python等的命令式编程风格,又涵盖了Haskell、ML等的函数式编程风格,本人以为是一门比较不错的语言,Spark大数据平台就是使用Scala编写的。鉴于Scala官网网页...

    scala-api-2.13.3.chm

    最新制作 scala 2.13.3 API 文档 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在 Java 虚拟机上,并兼容现有的 Java 程序。

    scala API 操作hbase表

    最近看了hbase的源码根据源码写了一些scala调动hbase表的API,话不多说直接上代码!Hadoop的版本是2.7.3,scala版本是2.1.1,hbase的版本是1.1.2 如果版本不同可以修改pom的依赖项,但要注意版本冲突。 并且在scala...

    Scala2.11.12离线API.zip

    Scala2.11.12离线API

    scala-2.12.2 api 最新 离线文档

    scala api 最新 离线文档

    scala-2.12.3 api document

    scala-2.12.3 api document,scala-2.12.3 api document,scala-2.12.3 api document,scala-2.12.3 api document

    Scala 2.11.8 API 手机版

    最新的scalaAPI手机版,网页版文件较大,稍作修改后再上传

    flink-scala_2.12-1.14.3-API文档-中文版.zip

    赠送原API文档:flink-scala_2.12-1.14.3-javadoc.jar 赠送源代码:flink-scala_2.12-1.14.3-sources.jar 包含翻译后的API文档:flink-scala_2.12-1.14.3-javadoc-API文档-中文(简体)版.zip 对应Maven信息:...

    scala-reflect-2.11.12-API文档-中英对照版.zip

    包含翻译后的API文档:scala-reflect-2.11.12-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.scala-lang:scala-reflect:2.11.12; 标签:scala、lang、reflect、中英对照文档、jar包、java; 使用...

    scala-compiler-2.12.7-API文档-中文版.zip

    包含翻译后的API文档:scala-compiler-2.12.7-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.scala-lang:scala-compiler:2.12.7; 标签:scala、lang、compiler、中文文档、jar包、java; 使用方法:解压翻译...

    spark-scala的API(英文版)

    关于spark-scala的离线帮助文档

    scala-xml_2.11-1.0.1-API文档-中文版.zip

    包含翻译后的API文档:scala-xml_2.11-1.0.1-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.scala-lang.modules:scala-xml_2.11:1.0.1; 标签:11、xml_2、scala、lang、modules、jar包、java、中文文档; ...

    Scala_中文学习资料_含Scala_2.7.6_API.rar

    Scala_中文学习资料_含Scala_2.7.6_API.rar。Scala_中文学习资料_含Scala_2.7.6_API.rar。

    scala-reflect-2.12.7-API文档-中文版.zip

    包含翻译后的API文档:scala-reflect-2.12.7-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.scala-lang:scala-reflect:2.12.7; 标签:scala、lang、reflect、中文文档、jar包、java; 使用方法:解压翻译后的...

    Scala 2.11-API.chm

    Scala 2.11-API.chm

Global site tag (gtag.js) - Google Analytics