package com.dt.spark.scala.basics
import scala.collection.mutable.ArrayBuffer
/**
* 大数据技术是数据集合以及对数据集合操作的统称,具体来说:
* 1.数据集合:会涉及数据的收集,存储等,收集会有很多技术,存储现在比较经典的是hadoop,很多情况下也会使用Kafka
* 2.对数据集合的操作技术,目前最火爆的是Spark
*
* Spark的框架实现语言是Scala,首选app的开发语言也是Scala,所以Scala对集合和集合操作就
* 至关重要,且需要非常强大
* 一个巧合是,Spark中对很多数据的操作的算子和Scala中对集合的操作的算子是一模一一样的,
* 也就是说,掌握了Scala中集合的操作,就可以直接去开发Spark了,非常美妙!!!
*/
object HelloArrayOps {
def main(args:Array[String]){
/**
* 关于Scala中数组的创建和操作:
* 1.最原始的数组创建方式:val array=new Array[Int](5),指定数组的类型是Int,
* 且固定数组的长度是5
*/
val array=new Array[Int](5)
array(0)=10 //数组的索引是0
for(item <- array) println(item)
/**
* 2.对数组元素进行访问的时候,下标范围在0~len-1,如果超过len-1或者小于0,会出现
* ArrayIndexOutOfBoundsException
*/
//array(5)=9
/**
* 3.最常用和最经典的创建方式,直接通过Array类名并传入参数的方式来创建数组实例,
* 其实这种方式也等价于Array.apply[Int](1,2,3,4,5),在背后的实现是调用Array的
* 工厂方法模式apply来构建出数组以及数组的内容
* 当然在这里可以去掉Int这个泛型类型
*/
val array1=Array[Int](5,4,3,2,1)
for(item <- array1) println(item)
val names=Array("Scala","Kafka","Spark")
for(name <- names) println(name)
/**
* 4.关于array本身,底层的实现是借助了JVM平台上的Java语言的数组的实现,是不可变的
* 5.如果我们想使用可变数组的话,首先需要导入ArrayBuffer,然后使用ArrayBuffer
*/
val arrayBuffer=ArrayBuffer[Int]()
/**
* 6.关于ArrayBuffer增加元素,默认情况下都是在ArrayBuffer末尾增加元素的,效率非常高
*/
arrayBuffer += 1
arrayBuffer += 2
arrayBuffer += (3,4,5,6,7,8,9,10)
arrayBuffer ++= Array(1,2,3)
arrayBuffer.insert(0, 1111,2222)
arrayBuffer.remove(arrayBuffer.length-1)
/**
* 7.当需要多线程并发操作的时候,把ArrayBuffer转换成为Array就非常重要
* 其实即使是Array,本身虽然元素不可删减,但是我们可以修改Array中每个元素的内容
* 所以多线程操作的时候还是必须考虑并发写问题
*/
val arr2=arrayBuffer.toArray
for(item <- arrayBuffer){
println(item)
}
for(i <- 0 until arrayBuffer.length) print(arrayBuffer(i)+" ")
println
for(i <- 0 until (arrayBuffer.length,2)) print(arrayBuffer(i)+" ")
println
for(i <- (0 until arrayBuffer.length).reverse) print(arrayBuffer(i)+" ")
println
println(array1.sum)
println(array1.max)
scala.util.Sorting.quickSort(array1) //进行升序排序
for(item <- array1) println(item)
println(array1.mkString("[",",","]"))
/**
* 8.如果想在已经有的数组的基础上通过作用于每个元素构成的新数组,
* 则可以通过yield语法来完成,这在大数据中意义重大:
* 1.它是在不修改已经有的Array的内容的基础上完成的,非常适合大数据处理
* 2.在大数据处理中,例如Spark中业务操作的核心就类似于yield,
* 来通过使用function对每个元素操作获得新的元素构成新的集合,例如MapPartitionsRDD
*/
val arrayAddedOne=for(item <- array1) yield item+1
println(arrayAddedOne.mkString(" "))
val arrayAddedEven=for(item <- array1 if item % 2 == 0) yield item*2
println(arrayAddedEven.mkString(" "))
/**
* 9.集合的操作往往可以通过丰富的操作算子,例如filter来过滤符合条件的元素,
* 例如map来进行每一个元素的加工
*/
println(array1.filter(_%2==0).mkString(" "))
println(array1.filter(_%2==0).map(_*3).mkString(" "))
}
}
归纳总结:1.大数据技术和数据集合
2.Spark中对很多数据的操作的算子和Scala中对集合的操作
3.关于可变数组和不可变数组
4.多线程并发操作的时候,需要考虑的事情
5.关于yield语法的使用
6.关于集合的函数式编程