Spark高级数据分析-第2章 用Scala和Spark进行数据分析
2.4 小试牛刀:Spark shell和SparkContext
本章使用的资料来自加州大学欧文分校机器学习资料库(UC Irvine Machine Learning Repository),这个资料库为研究和教学提供了大量非常好的数据源,
这些数据源非常有意义,并且是免费的。由于网络原因,无法从原始地址下载数据集,这里可以从以下链接获取:
https://pan.baidu.com/s/1dENp41V
或 http://pan.baidu.com/s/1c29fBVy
获取数据集以后,可以使用FileZilla等FTP工具上传到Hadoop集群(作者实验环境是VMware下的Hadoop集群),然后解压缩:
$ unzip donation.zip
$ unzip 'block_*.zip' 在 Hadoop 集群的 HDFS 上为块数据创建一个目录,然后将数据集文件
复制到 HDFS 上:
$ hadoop fs -mkdir linkage
$ hadoop fs -put block_*.csv linkage (说明:当前目录为存放block_*.csv文件的目录) 作者的 Hadoop 集群(Hadoop 2.7.2 + Spark 2.1.0 + Scala 2.12.1)支持 YARN,通过为 Spark master 设定
yarn-client 参数值,就可以在集群上启动 Spark 作业:
$ spark-shell --master yarn --deploy-mode client 创建RDD:
scala> var varblocks = sc.textFile("hdfs:///linkage")
varblocks: org.apache.spark.rdd.RDD[String] = hdfs:///linkage MapPartitionsRDD[1] at textFile at <console>:24
2.5 把数据从集群上获取到客户端
使用 RDD 的 first 方法,该方法向客户端返回 RDD 的第一个元素:
scala> rawblocks.first
res15: String = "id_1","id_2","cmp_fname_c1","cmp_fname_c2","cmp_lname_c1","cmp_lname_c2","cmp_sex","cmp_bd","cmp_bm","cmp_by","cmp_plz","is_match
如果知道 RDD 只包含少量记录,可以用 collect 方法向客户返回一个包含所有 RDD 内容的数组的数组。由于不知道当前数据集有多大,所以就不尝试了。
还可以用 take 方法,这个方法在 first 和 collect 之间做了一些折衷,可以向客户端返回
一个包含指定数量记录的数组。使用 take 方法获取记录关联数据集的前 10 行记录:
scala> val head = rawblocks.take(10)
head: Array[String] = Array("id_1","id_2","cmp_fname_c1","cmp_fname_c2","cmp_lname_c1","cmp_lname_c2","cmp_sex","cmp_bd","cmp_bm","cmp_by","cmp_plz","is_match", 37291,53113,0.833333333333333,?,1,?,1,1,1,1,0,TRUE, 39086,47614,1,?,1,?,1,1,1,1,1,TRUE, 70031,70237,1,?,1,?,1,1,1,1,1,TRUE, 84795,97439,1,?,1,?,1,1,1,1,1,TRUE, 36950,42116,1,?,1,1,1,1,1,1,1,TRUE, 42413,48491,1,?,1,?,1,1,1,1,1,TRUE, 25965,64753,1,?,1,?,1,1,1,1,1,TRUE, 49451,90407,1,?,1,?,1,1,1,1,0,TRUE, 39932,40902,1,?,1,?,1,1,1,1,1,TRUE)
为了更容易读懂数组的内容,我们可以用 foreach 方法并结合 println 来打印
出数组中的每个值,并且每一行打印一个值:
scala> head.foreach(println)
"id_1","id_2","cmp_fname_c1","cmp_fname_c2","cmp_lname_c1","cmp_lname_c2","cmp_sex","cmp_bd","cmp_bm","cmp_by","cmp_plz","is_match"
37291,53113,0.833333333333333,?,1,?,1,1,1,1,0,TRUE
39086,47614,1,?,1,?,1,1,1,1,1,TRUE
70031,70237,1,?,1,?,1,1,1,1,1,TRUE
84795,97439,1,?,1,?,1,1,1,1,1,TRUE
36950,42116,1,?,1,1,1,1,1,1,1,TRUE
42413,48491,1,?,1,?,1,1,1,1,1,TRUE
25965,64753,1,?,1,?,1,1,1,1,1,TRUE
49451,90407,1,?,1,?,1,1,1,1,0,TRUE
39932,40902,1,?,1,?,1,1,1,1,1,TRUE
CSV文件有一个标题行需要过滤掉, 以免影响后续分析。我们可以将标题行中出现的 "id_1" 字
符串作为过滤条件, 编写一个简单的 Scala 函数来测试一行记录中是否包含该字符串,代码如下:
def isHeader(line: String) = line.contains("id_1")
isHeader: (line: String)Boolean
我们其实想要的是所有非标题行。为了完成这个目标,Scala 可以提供 2 种方法。第一种时利用 Array 类的 filterNot 方法:
scala> head.filterNot(isHeader).length
res17: Int = 9
还可以利用 Scala 对匿名函数的支持,在 filter 函数里面对 isHeader 函数取非:
scala> head.filter(x => !isHeader(x)).length
res18: Int = 9
2.6 把代码从客户端发送到集群
用于过滤集群上整个数据集的语法和过滤本地机器上的 head 数组的语法一模一样。
scala> val noheader = rawblocks.filter(x => !isHeader(x))
noheader: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[45] at filter at <console>:29
Spark高级数据分析-第2章 用Scala和Spark进行数据分析的更多相关文章
- [Spark性能调优] 第二章:彻底解密Spark的HashShuffle
本課主題 Shuffle 是分布式系统的天敌 Spark HashShuffle介绍 Spark Consolidated HashShuffle介绍 Shuffle 是如何成为 Spark 性能杀手 ...
- Spark简单介绍,Windows下安装Scala+Hadoop+Spark运行环境,集成到IDEA中
一.前言 近几年大数据是异常的火爆,今天小编以java开发的身份来会会大数据,提高一下自己的层面! 大数据技术也是有很多: Hadoop Spark Flink 小编也只知道这些了,由于Hadoop, ...
- 2-Spark高级数据分析-第二章 用Scala和Spark进行数据分析
数据清洗时数据科学项目的第一步,往往也是最重要的一步. 本章主要做数据统计(总数.最大值.最小值.平均值.标准偏差)和判断记录匹配程度. Spark编程模型 编写Spark程序通常包括一系列相关步骤: ...
- Spark 实践——用 Scala 和 Spark 进行数据分析
本文基于<Spark 高级数据分析>第2章 用Scala和Spark进行数据分析. 完整代码见 https://github.com/libaoquan95/aasPractice/tre ...
- Spark高级数据分析——纽约出租车轨迹的空间和时间数据分析
Spark高级数据分析--纽约出租车轨迹的空间和时间数据分析 一.地理空间分析: 二.pom.xml 原文地址:https://www.jianshu.com/p/eb6f3e0c09b5 作者:II ...
- 4-Spark高级数据分析-第四章 用决策树算法预测森林植被
预测是非常困难的,更别提预测未来. 4.1 回归简介 随着现代机器学习和数据科学的出现,我们依旧把从“某些值”预测“另外某个值”的思想称为回归.回归是预测一个数值型数量,比如大小.收入和温度,而分类则 ...
- Spark架构与作业执行流程简介(scala版)
在讲spark之前,不得不详细介绍一下RDD(Resilient Distributed Dataset),打开RDD的源码,一开始的介绍如此: 字面意思就是弹性分布式数据集,是spark中最基本的数 ...
- 使用scala开发spark入门总结
使用scala开发spark入门总结 一.spark简单介绍 关于spark的介绍网上有很多,可以自行百度和google,这里只做简单介绍.推荐简单介绍连接:http://blog.jobbole.c ...
- idea中使用scala运行spark出现Exception in thread "main" java.lang.NoClassDefFoundError: scala/collection/GenTraversableOnce$class
idea中使用scala运行spark出现: Exception in thread "main" java.lang.NoClassDefFoundError: scala/co ...
随机推荐
- 深入解析SQL Server并行执行原理及实践
http://dbaplus.cn/news-21-431-1.html
- 高并发环境下,Redisson实现redis分布式锁
原文:http://tlzl0526-gmail-com.iteye.com/blog/2378853 在一些高并发的场景中,比如秒杀,抢票,抢购这些场景,都存在对核心资源,商品库存的争夺,控制不好, ...
- 实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性、网格、瀑布流效果演示
实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性.网格.瀑布流效果演示 效果预览 实例APP 小米应用商店 使用方法 build.gradle文件 dependenc ...
- NodeJS搭建HTTP服务器
NodeJS本来的用途是编写高性能Web服务器.我们首先在这里重复一下官方文档里的例子,使用NodeJS内置的http模块简单实现一个HTTP服务器. 新建server.js var http = r ...
- SQLAlchemy使用笔记--SQLAlchemy ORM(二)
參考: http://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html#building-a-relationship http://docs.sqla ...
- WAF防御能力评测及工具
本篇文章介绍如何从常规攻击的防御能力来评测一款WAF.一共覆盖了十六种攻击类型,每种类型均从利用场景(攻击操作的目的),注入点(漏洞产生的地方,比如说大多数WAF都会较全面地覆盖来自GET请求的攻击, ...
- SqlServer数据库1433端口问题1
在本地使用telnet ip 1433 命令测试数据库1433端口是否打开,总是提示错误,根据网上查找资料总结了如下两点思路供参考,欢迎指正! (1)第一种情况可能是"Telnet客户端& ...
- asset bundle打包策略
一次引用的 不单独打包 2次的看大小 小的不单独打包 2次以上单独打包 2这个值 可以测一测 取平衡
- Axios使用文档总结
vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios.Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 一.安装 ...
- Mac触控板常用的手势操作
Mac触控板常用的手势操作 学习了:http://topbook.cc/archives/151 一个手指直接点击,类似Windows中鼠标左键功能,同时在苹果Safari等浏览器中,这个手势还 ...