大数据系列第一课:scala基础

By | 2018年11月27日

第一阶段:Spark streamingspark sqlkafkaspark内核原理(必须有一个大型项目经验);

第二阶段:spark运行的各种环境,各种故障的解决,性能优化(精通spark内核、运行原理);

第三阶段:流处理、机器学习为鳌头,需要首先掌握前两个阶段的内容;

跟随王家林老师的零基础讲解,注重动手实战,成为spark高数,笑傲大数据之林!

第一部分:学习笔记

内容:

1 Scala的重大价值

2 Scala基础语法入门实战

3 Scala函数入门实战

4 ScalaArrayMapTuple实战

综合案例及Spark源码解析

一、scala价值

Scala可伸缩的语言的英语翻译是:Scalable Language。它是一门多范式的编程语言,一种类似java的编程语言,集成面向对象编程和函数式编程的各种特性并完美结合,熟练掌握scala对于学习spark来说至关重要。

二、Scala函数定义:

(scala函数定义时候默认会导入包)

有参数的函数定义

def 函数名(参数列表,…):返回结果类型={…}

① 有时函数必须制定返回结果类型,如函数时递归,就必须明确制定返回结果类型;

② 如果函数仅一个语句,连花括号都可以不写。如是max函数就成了这样,作用功能仍然没有变化;

③ Scala语言在进行函数调用时可不加();

④ Scala语言在编写的时候亦可以不用加“;”

⑤ Scala中,i++或者++i都不能其作用,只能使用i=i+1

⑥ foreach与函数字面量

函数字面量格式:参数列表 => 函数体

(x: Int, y:Int) => x + y

⑦ for循环中是val类型,因此在for表达式中不能重新对其赋值,<-可以理解为其中的意思for(arg<-args)函数调用。

//可以使用sum( 1 to 100 _*)求和
 val arr= Array(10,11,2,4,123,2)
 val hello = for(i<- 0 until(arr.length,2))println(arr(i)) 
//注:Scala 三元符表达示例:
 var file=if(!args.isEmpty)args(0) else scala.xml

使用scala解释器REPL中的黏贴模式,将代码块黏贴进去方便执行分析。

  //Scala输入输出形式较丰富
  print("\n I'm a Student!")
  printf("%s the future of BigDate computation framework:\n","Spark")

三、字段定义

(1)val:类似java中final类型的变量(常量)

1,基本格式:val 变量名:变量类型 = 值

2,其中有时变量类型可以省略,可以自动识别

3,常量不能赋值,修改

(2)var:等同于java中的非final型变量

四、scala中的Array、Map、Tuple实战

(1)map

Map就是键值对的集合。在Scala中,Map是对偶(键值对的另一个说法)的集合。->操作符用来创建对偶,即key和values。

  /*
   * Map:映射,把值和集合中的元素联系起来,使用任意类型的键
   */
  val map1 = Map{"hadoop"->1 }
  map1 + ("spark"->2)
  map1(("spark")=3          //更改已有的值 
  map1.contains("scala")     //检查是否包含
  map1.keySet                //返回key集合
  //添加多个对偶,使用“+=”操作符:
  map1+=("Flink"->3,"Hbase"->5)
  //移除某个对偶,使用“-=”操作符: 
  map1-="hadoop"
  import scala.collection.mutable._
  val map2 = mutable.Map.empty[String,Int]//创建空map

(2)List

List列表(不可变)

1,类型都是相同的

2,不可变的,(Array虽然长度固定,但是元素之使可变的)

3,(:::)实现叠加List,(::)cons:将新元素组合到列表的最前端

  /*
   * List:支持头部的快速删除和添加,不可变,列表的所有元素都具有相同类型,类似于数组Array
   */
  val color =  List("yellow","blue")
  val list2 = (1,2,3)
  var list3 = 4
  def list4:Int = 5
  /*
 * listBuffer:可以更加高效的通过添加元素的方式构建列表
 * 元素的添加使用+=操作符
 * 元素的前缀使用+:操作符     
 */
  import scala.collection.mutable.ListBuffer
     val li= new ListBuffer[Int]
     li+= 1
     li +=2
     3+:li
     li.toList
     println(li(2))

(3)Array数组

 /*/
   * Array:使用基于0的索引高效访问任意位置的元素
   */
  val array1 = Array[Int](1,2,3,4,54,5,5)
  val array3 =  new Array[Int](3) //创建长度已知,内容未知
  println(array3(2))
  array1.clone()
  array1.length
  var array = array1 
  /*
   * ArrayBuffer:类似于数组,可以在序列的结束和开始的地方添加元素
  * 创建ArrayBuffer的时候必须指定它的类型参数,可以不指定数组的长度
  * ArrayBuffer也使用+=添加元素
  */
    import scala.collection.mutable.ArrayBuffer
    val ar= new ArrayBuffer[String]()  
    ar += "hadoop"
    ar += "Spark"
    ar +: "scala"
    li.length
 li(2)
 Ar.remove(2,1)

(4)Tuple元组(不可变)

Scala中,元组是n个对象的一个聚集(Mapn=2个对象的聚集),元组可以包含不同类型的元素。

1,元组也是不可变的,但是元组可以是不同类型的数据

2,实例化:var a = (,)

3,可以通过点号,下划线,-NN1开始)的索引访问元素

  /*
   * Tuple:元组,把固定数量的条木组合在一起整体传送,可以包含不同	   *的类型
   */
  val tuple = (1,"spark",true)
  tuple._1
  tuple._2
  tuple.->(1)

第二部分:作业完成

1、移除一个数组中第一个负数后的所有负数;(效率)

  import Array._
  import scala.collection.mutable._
  val myArray = new ArrayBuffer[Int]()
  while(myArray!=null){
  val arr:Array[Int] ={for(i <- 0 until myArray.length if myArray(i)<0) concat(myArray.filter ( _>0),myArray.filter (_ <0)(0))else myArray.toArray}
  println(arr)
    //concat()方法来连接两个数组

发表评论