文档章节

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

九劫散仙
 九劫散仙
发布于 2017/07/31 20:34
字数 1298
阅读 13
收藏 1

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非常功能非常类似,用起来非常方便。

© 著作权归作者所有

九劫散仙
粉丝 268
博文 175
码字总数 189625
作品 0
海淀
私信 提问
如何用 Spark 快速开发应用?

本文由伯乐在线 -EluQ 翻译,JustinWu 校稿。未经许可,禁止转载! 英文出处:Nitin Bandugula。欢迎加入翻译组。 如果你还没有仔细研究过 Spark (或者还不知道 Spark 是什么),那么本文很...

伯乐在线
2015/07/14
0
0
在Scala中构建Web API的4大框架

Scala是一种强大的语言,很快就成为许多开发人员的最爱。然而,语言只是一个起点-并非每个函数都将由语言核心覆盖。Scala还创建了一些厉害的框架。接下来看看Scala的4个强大框架以及其优点和...

数据星河
2018/11/15
12
0
Spark SQL 数据统计 Scala 开发小结

在这篇文章中: 1、RDD Dataset 和 DataFrame 速览 2、使用介绍 参考 1、RDD Dataset 和 DataFrame 速览 RDD 和 DataFrame 都是一个可以看成有很多行,每一行有若干列的数据集(姑且先按照记...

李德鑫
2017/08/16
0
0
【四 Twirl模板引擎】 1. 模板引擎

基于Scala的类型安全的模板引擎 Play提供了基于Scala的强大模板引擎Twirl。它的诞生灵感来自于 ASP.NET Razor。它有如下特点: 简洁、流畅、富于表现力:它能让你尽可能少的打字,同时提供了...

Landas
2018/11/02
57
0
高盛最新调查:Python超过汉语成为未来最重要技能,你准备学哪种编程语言?

大数据文摘作品 作者:Peter Gleeson 编译:白丁,吴双,ether,魏子敏 如果让你选择一种语言,你觉得Python和中文,哪个对于未来更重要? 最近,一直以高素质实习生项目闻名的高盛集团发布了...

数据汪
2017/09/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式协调服务zookeeper

ps.本文为《从Paxos到Zookeeper 分布式一致性原理与实践》笔记之一 ZooKeeper ZooKeeper曾是Apache Hadoop的一个子项目,是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它...

ls_cherish
今天
4
0
redis 学习2

网站 启动 服务端 启动redis 服务端 在redis 安装目录下 src 里面 ./redis-server & 可以指定 配置文件或者端口 客户端 在 redis 的安装目录里面的 src 里面 ./redis-cli 可以指定 指定 连接...

之渊
昨天
2
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
昨天
4
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
昨天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
昨天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部