spark高级数据分析系列之第二章用 Scala 和 Spark 进行数据分析

2.1数据科学家的Scala

spark是用scala语言编写的,使用scala语言进行大数据开发的好处有

1、性能开销小

减少不同环境下传递代码和数据的错误和性能开销

2、能用上最新的版本和最好的功能

Spark的新功能毫无疑问是首先适配scala语言,但使用spark的所有功能可不是那么容易

3、有助于了解spark的原理

2.2小试牛刀

接下来是通过一个数据清理的例子来熟悉scala和spark,可以从http://bit.ly/1Aoywaq下载本节的数据集(需要下载),推荐一个VPN网址一小时VPN。

数据的预览

spark高级数据分析系列之第二章用 Scala 和 Spark 进行数据分析_第1张图片

第一步是读取数据

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类里面


然后把字符串数据转换为数据本来的类型。

id_1 int
id_2 int
cmp_fname_c1到cmp_plz double
is_match boolean
可以看到表格中有很多?,代表着数据缺失,在数据类型转换的同时需要把?转为NAN

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()



你可能感兴趣的:(spark)