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

来源:互联网 发布:英语单词读音软件小学 编辑:程序博客网 时间:2024/05/21 10:14

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")//读取一个表格的数据到RDDval 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_1intid_2intcmp_fname_c1到cmp_plzdoubleis_matchboolean可以看到表格中有很多?,代表着数据缺失,在数据类型转换的同时需要把?转为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()



阅读全文
0 0