spark高階資料分析系列之第二章用 Scala 和 Spark 進行資料分析
阿新 • • 發佈:2018-12-25
2.1資料科學家的Scala
spark是用scala語言編寫的,使用scala語言進行大資料開發的好處有
1、效能開銷小
減少不同環境下傳遞程式碼和資料的錯誤和效能開銷
2、能用上最新的版本和最好的功能
Spark的新功能毫無疑問是首先適配scala語言,但使用spark的所有功能可不是那麼容易
3、有助於瞭解spark的原理
2.2小試牛刀
接下來是通過一個數據清理的例子來熟悉scala和spark,可以從http://bit.ly/1Aoywaq下載本節的資料集(需要翻牆下載),推薦一個VPN網址一小時VPN。
資料的預覽
第一步是讀取資料
val conf = new SparkConf().setAppName("WordCount").setMaster("local") //先生成RDD的配置物件conf,配置名稱WordCount,執行在本地模式 val sc = new SparkContext(conf) val rawblock1 = sc.textFile("/home/sam/下載/linkage/donation/block_1.csv")//讀取一個表格的資料到RDD val rawblock2 = sc.textFile("/home/sam/下載/linkage/donation/block_2.csv") val raws = rawblock1.union(rawblock2) //合併RDD
然後去除表格的頭部
def isHeader(line:String) = line.contains("id_1") //包含字元“id_1”行就是表格頭部 val noheader = raws.filter(!isHeader(_)) //RDD是隻讀的,把不包含頭部的資料篩選出來生成一個新的RDD
資料轉換異常資料處理
為了讓資料更方便使用,重新整理資料的結構,把資料分為4部分
case class MatchData(id1: Int, id2: Int,scores: Array[Double], matched: Boolean)
定義一個類,再通過下面的parse()方法把每行資料整合到MatchData類裡面
然後把字串資料轉換為資料本來的型別。
可以看到表格中有很多?,代表著資料缺失,在資料型別轉換的同時需要把?轉為NAN
id_1 int id_2 int cmp_fname_c1到cmp_plz double is_match boolean def toDouble(s: String) = {if ("?".equals(s)) Double.NaN else s.toDouble}
定義把每行資料轉重新結構化為MatchData類的方法
def parse(line: String) = { val pieces = line.split(',') val id1 = pieces(0).toInt val id2 = pieces(1).toInt val scores = pieces.slice(2, 11).map(toDouble) val matched = pieces(11).toBoolean MatchData(id1, id2, scores, matched) }
把noheader RDD轉為結構化RDD
val parsed = noheader.map(line => parse(line))
可以把結構化的資料分組,按照is_match的值進行分組val grouped = parsed.groupBy(_.matched)
把每個分組的資料個數打印出來
grouped.mapValues(_.size).foreach(println)
關閉spark
sc.stop()