- 浏览: 2183658 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
元组在Scala语言中是一种十分重要的数据结构,类似数据库里面的一行记录(row),它可以将不同类型的值组合成一个对象,在实际应用中十分广泛。
先来看一个简单的tuple定义:
```` val tuple=("张三",25)//定义一个tuple val (name,age)=("张三",25)//变量绑定模式 ````上面的第二种例子中,可以直接通过name和age来访问单个tuple的元素
例子(1):
一个简单的模式匹配
```` val tuple=(1,2,3,4) def tupleMatch(x:Any)=x match { case (first,second)=> println(s"第一个元素:${first} 第二个元素:${second}") case (first,_,three,_)=> println(s"第一个元素:${first} 第三个元素:${three}") case _=> println("没有任何匹配") } tupleMatch(tuple)//匹配上面的第二个 ````例子(2):
根据类型匹配
```` def typeMatch(x:Any)=x match { case x:String=> println("string") case x:Int=> println("int") case x:Boolean=>println("boolean") case _=> println("其他") } typeMatch("x") ````注意上面的代码里面case后面的如果有List[String]类型的,最好用一个类封装起来在做匹配,否则会出错。具体的方式请参考:
https://www.cakesolutions.net/teamblogs/ways-to-pattern-match-generic-types-in-scala
例子(3):
变量绑定模式
```` //定义一个对象元组 case class Dog(val name:String,val age:Int) val dog=Dog("Pet",2) def patternMatch(x:Any)=x match { case d@Dog(_,_)=>println("变量值:"+d.name) case _=> println("默认") } patternMatch(dog)//Pet ````注意普通的类不能直接使用上面的模式匹配
例子(4):
for循环的使用元组进行的模式匹配
```` val map= Map("java"->"Hadoop","js"->"vue","scala"->"spark") //1,变量模式匹配 for( (k,v)<-map ){ println(k,v) } println("====================") //2,常量模式匹配,第二个值必须是spark,才会打印出来 for( (k,e@"spark")<-map ){ println(k,e) } println("====================") //3,类型匹配模式,注意elasticsearch是不会被打印出来的 for( (k,v:String)<- Map("java"->"Hadoop","js"->"vue","scala"->"spark", "elasticsearch"->"java".size) ){ println(k,v) } println("====================") //4,构造函数模式匹配 case class Dog(val name:String,val age:Int) for(Dog(name,age)<-List(Dog("pet",2),Dog("penny",3),Dog("digo",4) ) ){ println(s"Dog ${name} is ${age} years old") } println("====================") //5,序列模式匹配 for( List(first,_*)<- List( List(1,2,3),List(4,5,6,7) ) ){ println(s"${first}") } println("====================") //6,变量绑定的另一种模式 val list2=List( List(1,2,3),List(4,5,6,7)) def list2Match(x:AnyRef)=x match { case List(first,e@List(4,_*)) => println(e) case _=> println("defalult") } list2Match(list2) ````结果:
```` (java,Hadoop) (js,vue) (scala,spark) ==================== (scala,spark) ==================== (java,Hadoop) (js,vue) (scala,spark) ==================== Dog pet is 2 years old Dog penny is 3 years old Dog digo is 4 years old ==================== 1 4 ==================== List(4, 5, 6, 7) ````
最后我们使用元组,来模拟一个类似下面的SQL的例子:
表(pet)结构:
```` name(string),ct(int) cat,2 cat,6 cat,2 dog,1 dog,2 ````统计语句:
```` select name ,sum(ct) as c,count(*),max(ct),min(ct) from pet group by name order by c desc ````
Scala代码如下:
```` val list = ArrayBuffer[(String, Int)]() list += (("cat", 2)) list += (("cat", 6)) list += (("cat", 2)) list += (("dog", 1)) list += (("dog", 2)) println("宠物名,数量") //使用打印所有的数据 for ((name, count) <- list) { println(name, count) } println("=================================") //求出,按宠物名分组,出现数量和,出现总次数,最大数量,最小数量,并按照总次数降序排序 val result = list.groupBy(_._1).map { case (key,valueList) => { val sum = valueList.map(_._2).sum//求valueList出现次数的总和 val maxCount = valueList.max._2//最大次数 val minCount = valueList.min._2//最小次数 (key -> (sum, valueList.size, maxCount, minCount))//以Map的结果返回 } }.toSeq.sortWith(_._2._1 > _._2._1) //转化成Seq后才能进行排序操作,相当于取的是_._2代表的是value的值, //继续_1代表的是取里面的sum进行降序排序,如果是<号,则是升序排 //使用元组遍历最终结果 println("宠物名,出现数量和,出现总次数,最大数量,最小数量") for( (name,(sum,size,maxCount,minCount)) <-result ){ println(name,sum,size,maxCount,minCount) } ````
其实,核心代码只有中间的这一部分:
```` val result = list.groupBy(_._1).map {//分组处理 case (key,valueList) => { val sum = valueList.map(_._2).sum//求valueList出现次数的总和 val maxCount = valueList.max._2//最大次数 val minCount = valueList.min._2//最小次数 (key -> (sum, valueList.size, maxCount, minCount))//以Map的结果返回 } }.toSeq.sortWith(_._2._1 > _._2._1)//降序排 ````
最终结果:
```` 宠物名,数量 (cat,2) (cat,6) (cat,2) (dog,1) (dog,2) ================================= 宠物名,出现数量和,出现总次数,最大数量,最小数量 (cat,10,3,6,2) (dog,3,2,2,1) ````
简单解释一下核心部分的代码含义:
首先执行了一个groupBy函数,对元组里面的第一个元素也就是宠物名进行
分组,分组之后,每个宠物名一样的数据会聚合在一起,然后执行一个map函数,对里面的valueList进行各种运算,得出来我们
需要的结果后,最终再以Map的数据结构返回,因为Map本身是没法排序的,所以我们得先需要转成Seq类型,最后再执行sortWith方法对value里面的最大次数进行降序排,如果是升序排,只需要把大于号该成小于号即可。
总结:
本篇主要介绍了tuple几种常见的应用场景,通过使用tuple数据结构配合上scala强大的函数方法,我们可以轻松愉快的处理的各种数据集,感兴趣的小伙伴可以自己尝试一下。
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
发表评论
-
Scala里面的排序函数的使用
2018-01-09 20:20 2644排序方法在实际的应用场景中非常常见,Scala里面有三种排序 ... -
Spark如何读取一些大数据集到本地机器上
2018-01-04 21:07 1680最近在使用spark处理分 ... -
使用Spark SQL的临时表解决一个小问题
2017-12-28 18:27 2453最近在使用spark处理一个业务场景时,遇到一个小问题,我在 ... -
Spark任务两个小问题笔记
2017-12-26 19:52 1649今天在用spark处理数据 ... -
Spark中foreachPartition和mapPartitions的区别
2017-12-25 21:19 3323spark的运算操作有两种类型:分别是Transformat ... -
Spark Streaming优雅的关闭策略优化
2017-12-07 19:26 4149前面文章介绍了不少有关Spark Streaming的off ... -
kafka版本不一致导致的一个小问题(二)
2017-12-04 21:37 8564背景介绍: 我们公司的实时流项目现在用的spark stre ... -
谈谈如何优雅的关闭正在运行中的Spark Streaming的流程序
2017-11-30 19:20 2301前面的文章,已经简 ... -
如何管理Spark Streaming消费Kafka的偏移量(三)
2017-11-28 23:41 5212前面的文章已经介绍了在spark streaming集成kaf ... -
理解Spark的运行机制
2017-11-23 21:52 1245Spark生态系统目前已经非常成熟了,有很多类型的任务都可以使 ... -
如何管理Spark Streaming消费Kafka的偏移量(二)
2017-11-16 19:30 4733上篇文章,讨论了在spar ... -
如何管理Spark Streaming消费Kafka的偏移量(一)
2017-11-14 20:42 4078最近工作有点忙,所以更新文章频率低了点,在这里给大家说声抱 ... -
在scala中使用spark sql解决特定需求(2)
2017-07-21 16:00 2282接着上篇文章,本篇来 ... -
在scala中使用spark sql解决特定需求
2017-07-20 19:53 1029spark sql一个强大之处就 ... -
Spark如何在一个SparkContext中提交多个任务
2017-07-04 19:09 6756在使用spark处理数据的时候,大多数都是提交一个job执行, ... -
如何使用scala+spark读写hbase?
2017-06-12 19:48 3446最近工作有点忙,所以文章更新频率低了点,希望大家可以谅解,好 ... -
使用ES-Hadoop插件结合spark向es插入数据
2017-05-05 17:19 5059上篇文章简单介绍了E ... -
spark sql 快速体验调试
2017-04-13 16:40 1057spark sql提供了更快的查询性能,如何能够更快的体验,开 ... -
spark on yarn 如何集成elasticsearch
2017-04-11 16:16 1555随着spark越来越流行,我们的很多组件都有可能和spark集 ... -
如何使用Spark的local模式远程读取Hadoop集群数据
2017-03-31 11:49 3010我们在windows开发机上使用spark的local模式读取 ...
相关推荐
Scala映射和元组.md
Scala中集合的使用 大学生 1. List 列表的使用 2. Set 集合的使用 3.Map 映射的使用 4. 元组的使用
Scala和Scala.js中的元组组成。 // tupleN + scalar, scalar + tupleN, tupleN + tupleM, up to Tuple22 " app.tulz " %%% " tuplez-full " % " 0.3.4 " // or // tupleN + scalar, scalar + tupleN, tupleN + ...
在Scala的数据结构中,元组(Tuple)用于存储不同类型的元素集合,元组的长度最多为22个元素。例如,可以创建一个包含两个元素的元组`val tuple = (1, "string")`。 集合是Scala数据结构的另一大重要部分,包括List...
- **互操作性**: 学习如何在Scala项目中使用Java类库和工具。 #### Actor和并发 - **并发模型**: 探索Scala中的Actor模型及其在并发编程中的作用。 #### 组合子解析 - **解析技术**: 学习如何使用组合子解析器来...
另外,为了在集成开发环境(IDE)中使用Scala,需要安装Scala插件。IntelliJ IDEA等流行的IDE提供了Scala插件,支持Scala语言的开发工作。插件的安装通常包括下载Scala插件文件,并将其放置到IDE的插件目录中,随后...
例如,它使用元组来表示多个值的集合,使用模式匹配进行数据解构。此外,函数可以作为一等公民,这意味着它们可以被赋值给变量,作为参数传递,或者作为返回值。这种灵活性极大地增强了代码的复用和模块化。 在...
- **元组(Tuple)**:Scala中的元组可以存储不同类型的值,是一种非常灵活的数据结构。 - **集合(Set)**: - 不可变集合:通过代码示例展示了如何创建和使用不可变集合。 - 可变集合:通过代码示例展示了如何创建和...
- **Scala编译器(scalac)**将Scala代码编译成Java字节码(.class文件),这意味着任何Java类都可以直接在Scala程序中使用。 - **Scala与JVM的紧密集成**使得开发者能够充分利用现有的Java库和技术栈。 2. **...
10. **隐式转换**:Scala的隐式转换可以在适当的时候自动将一个类型转换为另一个类型,简化了代码,但也需要谨慎使用以防止意外的类型转换。 **进阶知识点** 11. **Scaladoc**:Scala的文档生成工具,用于创建API...
在Scala中,可以使用花括号`{}`将一系列语句组合成一个块表达式。最后一个表达式的值即为整个块表达式的返回值。 ##### 4.5 循环 Scala支持各种循环结构,包括`for`循环和`while`循环。其中,`for`循环支持更高级...
数据结构章节介绍了Scala的集合类型,包括数组、元组、列表、队列、映射(Map)、和Set集合。集合操作部分进一步讲解了如何进行映射操作、扁平化映射以及过滤集合等高级操作。 总之,Scala高级语言设计的知识体系是...
- **定义函数**:使用`def`关键字也可以定义函数,但在Scala中,函数通常指代的是匿名函数或lambda表达式。 - **方法和函数的区别**:方法是类的一部分,而函数是独立存在的。通过`_`符号可以将方法转换为函数。 **...
8. **表达式导向编程**:Scala鼓励使用表达式而非语句,使得代码更像数学公式,更具可读性。例如,if表达式和for循环都可以直接返回结果。 9. **Case类和Case对象**:Scala中的Case类和Case对象简化了模式匹配和...
在for循环中,Swift使用for-in来遍历集合或进行范围迭代,例如`for i in 1...5 { print("i=\(i)") }`,而Scala使用`for (i ) yield i^2`来实现类似功能。Scala还提供了for-yield结构来生成序列,Swift在这方面没有...
Lex Spoon在文档中被提及为Martin Odersky的合作者,他在Scala方面的贡献包括与Odersky一起在EPFL工作了两年。Bill Venners则是Artima公司的总裁,该公司拥有的商标包括ArtimaPress。在Scala的早期开发阶段,这些...
Scala 还引入了模式匹配,这是一种强大的控制结构,可以用于解构复杂的数据结构,如列表、元组或自定义类型。通过模式匹配,我们可以简洁地处理各种情况,而不需要冗长的 if-else 语句。 类型类是 Scala 的另一个...
- **元组**:元组允许你组合多种类型的数据在一起。 - **集合框架**:Scala的集合库提供了丰富的数据结构,如List、Set、Map等,它们都是不可变的,支持函数式编程风格。 ### 5. 类型系统 - **类型推断**:Scala的...
在《Scala实用指南》的代码清单中,"961.Pragmatic-Scala__ReactivePlatform"可能是一个与响应式平台相关的示例,可能涵盖了Scala与其他响应式框架(如Akka或Reactive Streams)的集成,展示了如何构建可扩展、容错...
此外,Scala与Java无缝集成,可以使用Java的库,并且可以运行在Java虚拟机上。这使得Scala成为了大数据处理领域的重要语言,Apache Spark就是一个用Scala编写的高性能数据处理框架,它极大地提升了数据处理的效率。 ...