前提,已經安裝好Scala
在Linux終端
準備資料:
a.txt 內容
HIVE 底層 是 hdfs 和 mapreduce 實現存儲 和 計算的 。
HIVE 也 可以 使用 hadoop 配置 的 壓縮 方法 對 中間 結果 或 最終 數據 進行 壓縮
1
import scala.io.Source
scala> val lines = Source.fromFile(“/usr/local/src/test_data/a.txt”).getLines()
lines: Iterator[String] = non-empty iterator
Iterator : 迭代器,不是一個集合
it…next() : 返回迭代器中的下一個元素,同時更新迭代器的狀態
it.hasNext(): 用于檢查迭代器中是否還有元素
scala> val lines = Source.fromFile(“/usr/local/src/test/a.txt”).getLines().toList
toList:將迭代器中的元素歸入到列表中進行返回
Range
定義: 序列, 包括起點和終點,按照給定步長的所有值,是一個特殊的Array
- [0,5)
scala> val a= Range(0,5)
a: scala.collection.immutable.Range = Range(0, 1, 2, 3, 4)
等價于
scala> val a = 0 until 5
a: scala.collection.immutable.Range = Range(0, 1, 2, 3, 4)
2.[0,5]
scala> val a = 0 until 5
a: scala.collection.immutable.Range = Range(0, 1, 2, 3, 4)
等價于
scala> val a = 0.to(5)
a: scala.collection.immutable.Range.Inclusive = Range(0, 1, 2, 3, 4, 5)
3.Range 和 list 轉換
scala> val list1 = (1 to 20).toList
list1: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
map
對 a 的每個元素進行遍歷然后 * 2
scala> val a = 1 to 5
a: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)
scala> a.map(x=>x*2)
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8, 10)
Vector 是一個容器,保存其他的數據對象,也可以稱為集合,是Scala標準包的,不用導包
1.創建Vector 對象
scala> var v1 = Vector(1,2,3)
v1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3)
2.索引Vector中的元素,索引是從0開始的
scala> print(v1(0))
1
3 遍歷Vector
scala> for(i<-v1) print(i+"/")
1/2/3/
Scala中(下劃線) _ 的用法
1,獲取集合中的每一個元素
scala> a.map(_*2)
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8, 10)
2 獲取元組(Tuple)中的元素
scala> val s = ("hello","scala")
s: (String, String) = (hello,scala)scala> s._1
res4: String = helloscala> s._2
res5: String = scala
3 導入所有包
import scala.io._
4 初始化變量 val 聲明的變量不能被修改
scala> var name:String=_
name: String = nullscala> var age:Int=_
age: Int = 0
函數 split
scala> var s = "all back money"
s: String = all back moneyscala> s.split(" ")
res6: Array[String] = Array(all, back, money)
打平函數:
flatten
scala> val s1 = List(Range(1,5),Range(0,5),Range(0,5))
s1: List[scala.collection.immutable.Range] = List(Range(1, 2, 3, 4), Range(0, 1, 2, 3, 4), Range(0, 1, 2, 3, 4))scala> val s2 = s1.flatten
s2: List[Int] = List(1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4)
1.針對每一個元素 * 2
方式一:
scala> s2.map(x=>x*2)
res9: List[Int] = List(2, 4, 6, 8, 0, 2, 4, 6, 8, 0, 2, 4, 6, 8)
方式二:
scala> s2.map(_*2)
res9: List[Int] = List(2, 4, 6, 8, 0, 2, 4, 6, 8, 0, 2, 4, 6, 8)
2 針對s1每個元素直接*2
方式一:
scala> s1.map(x=>x.map(x=>x*2))
res10: List[scala.collection.immutable.IndexedSeq[Int]] = List(Vector(2, 4, 6, 8), Vector(0, 2, 4, 6, 8), Vector(0, 2, 4, 6, 8))
方式二:
scala> s1.map(_.map(_*2))
res11: List[scala.collection.immutable.IndexedSeq[Int]] = List(Vector(2, 4, 6, 8), Vector(0, 2, 4, 6, 8), Vector(0, 2, 4, 6, 8))
flatMap
scala> s1.flatMap(_.map(_*2))
res12: List[Int] = List(2, 4, 6, 8, 0, 2, 4, 6, 8, 0, 2, 4, 6, 8)等價于scala> s1.map(_.map(_*2)).flatten
res13: List[Int] = List(2, 4, 6, 8, 0, 2, 4, 6, 8, 0, 2, 4, 6, 8)
練習:對lines進行 wordCount
scala> val lines = Source.fromFile("/usr/local/src/test_data/a.txt").getLines().toList
lines: List[String] = List("HIVE 底層 是 hdfs 和 mapreduce 實現存儲 和 計算的 。 ", HIVE 也 可以 使用 hadoop 配置 的 壓縮 方法 對 中間 結果 或 最終 數據 進行 壓縮)scala> lines.map(_.split(" "))
res7: List[Array[String]] = List(Array(HIVE, 底層, 是, hdfs, 和, mapreduce, 實現存儲, 和, 計算的, 。), Array(HIVE, 也, 可以, 使用, hadoop, 配置, 的, 壓縮, 方法, 對, 中間, 結果, 或, 最終, 數據, 進行, 壓縮))scala> lines.map(_.split(" ")).flatten
res14: List[String] = List(HIVE, 底層, 是, hdfs, 和, mapreduce, 實現存儲, 和, 計算的, 。, HIVE, 也, 可以, 使用, hadoop, 配置, 的, 壓縮, 方法, 對, 中間, 結果, 或, 最終, 數據, 進行, 壓縮)scala> lines.flatMap(_.split(" "))
res15: List[String] = List(HIVE, 底層, 是, hdfs, 和, mapreduce, 實現存儲, 和, 計算的, 。, HIVE, 也, 可以, 使用, hadoop, 配置, 的, 壓縮, 方法, 對, 中間, 結果, 或, 最終, 數據, 進行, 壓縮)