1. 程式人生 > >Scala資料集合操作

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,例如MapPartitionsRDD
9、集合的操作往往可以通過豐富的操作運算元,例如filter來過濾需要條件的元素,例如map來進行每一個元素的加工;

DEMO

    val array = Array(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,5,6,7,8,9,10)
    arrayBuffer ++= Array(1,2,3)
    arrayBuffer.insert(arrayBuffer.length - 1, 100,1000)
    arrayBuffer.remove(arrayBuffer.length -2)
    arrayBuffer.toArray //當需要多執行緒併發操作的時候,把ArrayBuffer轉換成為Array就非常重要。
    for(item <- arrayBuffer) println(item)
    
    for(i <- 0 until array.length) print(array(i) + " ")
    println
    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)
    scala.util.Sorting.quickSort(array)  //對陣列進行升序排序,內容變成了2,3,4,5,10
    println("quickSort = " + array.mkString(","))
    println(array.mkString("*****", ",", "*****"))
    
    val arrayAddedOne = for(item <- array) yield item + 1
    println(arrayAddedOne.mkString(" "))
    val arrayEven = for(item <- array if item % 2 == 0) yield item
    println(arrayEven.mkString(","))
    
    println(array.filter { x => x % 2 == 0}.mkString("  "))
    println(array.filter { _ % 2 == 0}.mkString("  "))
    println(array.filter { _ % 2 == 0}.map { _ * 10 }.mkString("  "))