第6课 :零基础实战Scala集合操作及Spark源码解析
2016-09-19 17:40
429 查看
本课内容
1.Spark中Scala集合操作鉴赏
2.Scala集合操作实战
------------------------------------------------------------------------------------------------------------------------
/**
* 大数据技术是数据的集合以及对数据集合的操作技术的统称,具体来说:
* 1.数据集合:会涉及数据的搜集、存储等,搜集会有很多技术,存储现在比较经典的是使用Hadoop,
* 也有很多情况使用Kafka(消息中间件,也可以作为存储系统)
* 2.对数据集合的操作技术:目前全球最火爆的是Spark
*
* Spark的框架实现语言是Scala,首选的应用程序开发语言也是Scala,所以Scala对集合以及集合
* 操作的支持就至关重要,且必须异常强大
* 一个补充说明:可能是巧合,Spark中对很多数据的操作算子和Scala中对集合的操作算子是一模一样的,
* 也就是说你掌握了Scala中集合的操作,基本上就可以直接去开发Spark代码啦,非常美妙
*
* 关于Scala中数据的创建与操作:
* 1.最最原始的创建数据的方式是形如val array = new Array[Int](5),
* 指定数组的类型Int且其固定长度是5个
* 2.对数组元素访问的时候,下标的范围在0到length-1的长度,
* 超过length-1的话,会出现数组越界异常:java.lang.ArrayIndexOutOfBoundsException
* 3.最常用和经典的创建数组的方式是形如:Array[Int](1,2,3,4,5),直接通过Array类名并传入参数
* 的方式来创建数组实例,在背后的实现是调用Array的工厂方法模式apply来构建出数组及数组的内容
* 4.关于Array本身是在底层的实现是借助了JVM平台上的Java语言的数组的实现,是不可变的
* 5.如果我们想使用可变数组的话,首先需要导入import scala.collection.mutable.ArrayBuffer,
* 然后使用ArrayBuffer这个可变数组
* 6.关于ArrayBuffer增加元素默认情况下都是在ArrayBuffer末尾增加元素的,效率非常高
* 7.当需要多线程并发操作的时候,把ArrayBuffer转换成Array就非常重要。其实,即使是Array,
* 其本身虽然不可变动(元素可删减),但我们可以修改Array中每个元素的内容,所以多线程操作的
* 时候必须考虑并发写的问题,如果是读的话就没关系
* 8.如果想在已经有的数组的基础上通过作用于每个元素来生成新的元素构成的新数组,
* 则可以通过yield语法来完成,这在大数据中意义重大:
* 第一点:它是在不修改已经有的Array的内容的基础上来完成的,非常适合大数据处理
* 第二点:在大数据中处理中,例如Spark中业务操作的核心思想就类似于yield,来通过
* function对每个元素操作获得新的元素构成的新的集合,其实就是新的RDD,
* 例如MapPartionsRDD
* 9.集合的操作往往可以通过丰富的操作算子,例如filter来过滤需要条件的元素,例如
* map来进行每一个元素的加工
*
*/
1.Spark中Scala集合操作鉴赏
2.Scala集合操作实战
------------------------------------------------------------------------------------------------------------------------
/**
* 大数据技术是数据的集合以及对数据集合的操作技术的统称,具体来说:
* 1.数据集合:会涉及数据的搜集、存储等,搜集会有很多技术,存储现在比较经典的是使用Hadoop,
* 也有很多情况使用Kafka(消息中间件,也可以作为存储系统)
* 2.对数据集合的操作技术:目前全球最火爆的是Spark
*
* Spark的框架实现语言是Scala,首选的应用程序开发语言也是Scala,所以Scala对集合以及集合
* 操作的支持就至关重要,且必须异常强大
* 一个补充说明:可能是巧合,Spark中对很多数据的操作算子和Scala中对集合的操作算子是一模一样的,
* 也就是说你掌握了Scala中集合的操作,基本上就可以直接去开发Spark代码啦,非常美妙
*
* 关于Scala中数据的创建与操作:
* 1.最最原始的创建数据的方式是形如val array = new Array[Int](5),
* 指定数组的类型Int且其固定长度是5个
* 2.对数组元素访问的时候,下标的范围在0到length-1的长度,
* 超过length-1的话,会出现数组越界异常:java.lang.ArrayIndexOutOfBoundsException
* 3.最常用和经典的创建数组的方式是形如:Array[Int](1,2,3,4,5),直接通过Array类名并传入参数
* 的方式来创建数组实例,在背后的实现是调用Array的工厂方法模式apply来构建出数组及数组的内容
* 4.关于Array本身是在底层的实现是借助了JVM平台上的Java语言的数组的实现,是不可变的
* 5.如果我们想使用可变数组的话,首先需要导入import scala.collection.mutable.ArrayBuffer,
* 然后使用ArrayBuffer这个可变数组
* 6.关于ArrayBuffer增加元素默认情况下都是在ArrayBuffer末尾增加元素的,效率非常高
* 7.当需要多线程并发操作的时候,把ArrayBuffer转换成Array就非常重要。其实,即使是Array,
* 其本身虽然不可变动(元素可删减),但我们可以修改Array中每个元素的内容,所以多线程操作的
* 时候必须考虑并发写的问题,如果是读的话就没关系
* 8.如果想在已经有的数组的基础上通过作用于每个元素来生成新的元素构成的新数组,
* 则可以通过yield语法来完成,这在大数据中意义重大:
* 第一点:它是在不修改已经有的Array的内容的基础上来完成的,非常适合大数据处理
* 第二点:在大数据中处理中,例如Spark中业务操作的核心思想就类似于yield,来通过
* function对每个元素操作获得新的元素构成的新的集合,其实就是新的RDD,
* 例如MapPartionsRDD
* 9.集合的操作往往可以通过丰富的操作算子,例如filter来过滤需要条件的元素,例如
* map来进行每一个元素的加工
*
*/
object C6 { def main(args: Array[String]): Unit = { //val array = new Array[Int](5); //创建数组长度为5 //Scala中最正统定义数组方式,在背后的实现是调用Array的工厂方法 //模式apply来构建出数组及数组的内容 //val array = Array[Int](1,2,3,4,5) //在这里可以去掉[Int]这个泛型类型,是因为Scala有类型推导能力,而我们已经传 //入了当前数组Array的值,所以可以根据值来推导出类型 val array = Array.apply(1,2,3,4,5) array(0) = 10 //数据的索引下标是从0开始的 //array(5) = 1 //数组下标越界异常:java.lang.ArrayIndexOutOfBoundsException for(item <- array){ println(item) } val names = Array("Scala","Kafka","Spark") for(item <- names)println(item) import scala.collection.mutable.ArrayBuffer val arrayBuffer = ArrayBuffer[Int]()//开始没有内容,需要指定类型 arrayBuffer += 1 arrayBuffer += 2 arrayBuffer += 3 arrayBuffer += 4 arrayBuffer += 5 arrayBuffer += (6,7,8,9,10) arrayBuffer ++= Array(11,12,13) //末尾增加 arrayBuffer.insert(arrayBuffer.length-1, 100,1000) //指定位置增加 arrayBuffer.remove(arrayBuffer.length-1)//指定位置删除 arrayBuffer.toArray //当需要多线程并发操作的时候,把ArrayBuffer转换成Array就非常重要 for(item <- arrayBuffer)println(item) for(i <- 0 until array.length)print(array(i)+" ") println //每2个元素打印一个元素 for(i <- 0 until (array.length,2))print(array(i)+" ") println //反转输出,其背后改变下标值 for(i <- (0 until array.length).reverse)print(array(i)+" ") println //数组内容相加 println("Sum=" + array.sum) //数组内容最大值 println("Max=" + array.max) //对数组进行升序排序,内容变成2,3,4,5,10, scala.util.Sorting.quickSort(array) print("quickSort=") for(item <- array)print(item+",") println //以友好方式打印出来 println("mkString="+array.mkString(",")) println("mkString="+array.mkString("***",",","***")) //生成新的数据,且内容加1 val arrayAddedOne = for(item <- array)yield item +1 println("arrayAddedOne:"+arrayAddedOne.mkString(" ")) //输出下标为偶数内容 val arrayEven = for(item <- array if item%2==0)yield item+1 println("arrayEven:"+arrayEven.mkString(" ")) println(array.filter { x => x % 2== 0}.mkString("+")) //简写 _ % 2 == 0 println(array.filter { _ % 2== 0}.mkString("+")) //输出下标为偶数内容,在乘以10 println(array.filter { _ % 2== 0}.map { _ *10 }.mkString("=")) } } |
相关文章推荐
- 第4课:零基础彻底实战Scala控制结构及Spark源码解析
- 第7课:零基础实战Scala面向对象编程及Spark源码解析
- 大数据Spark “蘑菇云”行动前传第4课:零基础彻底实战Scala控制结构及Spark源码解析
- 大数据Spark “蘑菇云”行动前传第22课:Scala集合和高级函数操作实战及Spark源码鉴赏.
- 大数据Spark “蘑菇云”行动前传第7课:零基础实战Scala面向对象编程及Spark源码解析
- 王家林亲授《DT大数据梦工厂》大数据实战视频“Scala深入浅出实战经典”视频、音频和PPT下载!第47讲:Scala多重界定代码实战及其在Spark中的应用源码解析
- Scala中上下文界定内幕中的隐式参数与隐式参数的实战详解及其在Spark中的应用源码解析之Scala学习笔记-52
- 第49讲:Scala中Variance代码实战及其在Spark中的应用源码解析学习笔记
- Scala中Variance代码实战及其在Spark中的应用源码解析之Scala学习笔记-40
- Scala中Context Bounds代码实战及其在Spark中的应用源码解析之Scala学习笔记-36
- Scala中隐式参数实战详解以及隐式参数在Spark中的应用源码解析之Scala学习笔记-50
- Scala 深入浅出实战经典 第61讲:Scala中隐式参数与隐式转换的联合使用实战详解及其在Spark中的应用源码解析
- Scala中类型变量Bounds代码实战及其在Spark中的应用源码解析之Scala学习笔记-34
- Scala并发编程实战初体验及其在Spark源码中的应用解析之Scala学习笔记-56
- Scala类型约束代码实战及其在Spark中的应用源码解析之Scala学习笔记-39
- 第60讲:Scala中隐式参数实战详解以及隐式参数在Spark中的应用源码解析学习笔记
- Scala深入浅出实战第67讲:Scala并发编程匿名Actor、消息传递、偏函数实战解析及其在Spark源码中的应用解析
- 第43讲:Scala中类型变量Bounds代码实战及其在Spark中的应用源码解析学习笔记
- ClassTag 、Manifest、ClassManifest、TypeTag代码实战及其在Spark中的应用源码解析之Scala学习笔记-37
- Scala中View Bounds代码实战及其在Spark中的应用源码解析之Scala学习笔记-35