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

使用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 是一个用于大数据处理的强大工具,它结合了Apache Spark的高性能计算框架与Scala编程语言的简洁性和表达力。这个zip压缩包很可能是包含了Spark的Scala开发接口及相关示例,便于开发者在Scala环境中...

    scala API 操作hbase表

    在本文中,我们将深入探讨如何使用Scala API操作HBase数据库。HBase是一个分布式、面向列的NoSQL数据库,它构建于Hadoop之上,提供实时访问大量数据的能力。Scala是一种强大的函数式编程语言,与Java虚拟机(JVM)...

    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.12.2 api 最新 离线文档

    总的来说,Scala 2.12.2 API离线文档是开发者不可或缺的参考资料,它涵盖了语言的核心组件,帮助开发者理解和利用Scala的强大功能。无论是进行简单的数据处理,还是构建复杂的分布式系统,或者是进行元编程和动态...

    Scala和Spark大数据分析函数式编程、数据流和机器学习

    Spark的DataFrame和Dataset API与Scala紧密集成,提供了强大的数据操作和优化。DataFrame允许进行SQL式的表达式操作,而Dataset结合了DataFrame的易用性和Scala的强类型安全,使得在大数据处理中编写类型安全的代码...

    Scala 2.11 API.chm

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

    scala-api-2.13.3.chm

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

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

    这个压缩包文件"Scala_中文学习资料_含Scala_2.7.6_API.rar"显然是为那些希望深入理解Scala编程的人准备的,特别是对于中文使用者,因为其中包含了一些中文文档。 首先,"Scala_2.7.6_API.chm"是一个帮助文件,通常...

    Scala API 2.9

    Scala API 2.9 是 Scala 编程语言的一个版本,其文档包含了丰富的信息,帮助开发者理解和使用这个版本的 Scala。Scala 是一种多范式的编程语言,融合了面向对象和函数式编程的特点,广泛应用于大数据处理、分布式...

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

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

    Scala2.11.12离线API.zip

    Scala2.11.12离线API

    Scala 2.11-API.chm

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念,设计目标是提供一种高效、灵活且表达力强的编程工具。Scala 2.11-API.chm文件是一个帮助文档,包含了Scala 2.11版本的核心API详细信息,是...

    电影评分数据汇总(使用spark2.4+scala, 分析采用spark RDD的API. 数据集采用标准电影评分数据).zip

    【资源说明】 1、该资源内项目代码都是经过测试运行成功,功能正常的情况下才上传的,请放心下载使用。...电影评分数据汇总,(使用spark2.4+scala完成, 分析采用spark RDD的API. 数据集采用标准电影评分数据).zip

    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手机版,网页版文件较大,稍作修改后再上传

    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的离线帮助文档

Global site tag (gtag.js) - Google Analytics