Spark 基础之 SparkR 快速上手

栏目: R语言 · 发布时间: 5年前

内容简介:本课程将学习 Spark 平台中对于 R 语言的支持前端——SparkR。课程将会讲解到如何在 SparkR 中创建和操作 DataFrame、如何运行 SQL 查询,以及如何利用机器学习相关的 API。最后还会通过一些简单的实例来学习如何在 SparkR 中进行时间序列分析。本课程难度为一般,属于初级级别课程,适合具有 Spark 基础的用户,熟悉 R 语言在 Spark 平台的应用。SparkR 是一个提供轻量级前端的 R 包,在 R 的基础上加入了 Spark 的分布式计算和存储等特性。在 Spar

SparkR 入门

一、实验介绍

实验内容

本课程将学习 Spark 平台中对于 R 语言的支持前端——SparkR。课程将会讲解到如何在 SparkR 中创建和操作 DataFrame、如何运行 SQL 查询,以及如何利用机器学习相关的 API。最后还会通过一些简单的实例来学习如何在 SparkR 中进行时间序列分析。

实验知识点

  • SparkR 中 的 DataFrame 创建
  • SparkR 中 的常用 DataFrame 操作
  • 在 SparkR 上运行 SQL 查询
  • 在 SparkR 上实现机器学习
  • 在 SparkR 中实现时间序列分析

实验环境

  • Xfce 终端
  • Spark 2.1.1

适合人群

本课程难度为一般,属于初级级别课程,适合具有 Spark 基础的用户,熟悉 R 语言在 Spark 平台的应用。

二、开发准备

SparkR 是一个提供轻量级前端的 R 包,在 R 的基础上加入了 Spark 的分布式计算和存储等特性。在 Spark2.1.1 中,SparkR 提供了一个分布式数据框(DataFrame)的实现,它能够支持诸如选取、过滤和聚集等操作。这个特性与 R 语言自身提供的特性类似,但 SparkR 能够作用于更大规模的数据集。

同时, SparkR 也通过 MLlib 支持分布式的机器学习。

在学习本课程之前,建议你掌握一定的 R 语言语法基础。实验楼为你提供以下学习 R 语言的课程:

三、实验步骤

本节将通过实践操作,带领大家快速上手SparkR以及利用SparkR进行时间序列分析。

本节实验包括以下2小节实验:

1、SparkR 快速上手

2、实例:在 SparkR 中实现时间序列分析

3.1 SparkR 快速上手

R 语言常用于统计计算,而在单机上进行的传统统计计算在面临大规模数据分析任务时,通常在计算效率、内存限制等方面会遇到瓶颈。

SparkR 的出现,便是为了结合功能成熟稳定的 R 语言和 Spark 对于大规模数据的处理能力好等优势。

SparkR 的 Shell 提供了一个简单的方式来让你学习其 API 用法。

请双击打开桌面上的 Xfce 终端,先切换到hadoop用户下:

su -l hadoop

Spark 基础之 SparkR 快速上手

然后在终端中输入以下命令来打开 SparkR 的交互式命令行窗口:

sparkR

Spark 基础之 SparkR 快速上手

实验楼的在线实验环境已配置好 SparkR 的环境变量,因此可以直接通过 sparkR 命令启动。若是自己配置,你可以在 SparkR 所在的目录输入 ./sparkR 命令或者将该目录加入系统环境变量 PATH 中。

在 SparkR 中,核心概念是数据框(DataFrame)。DataFrame 是一个分布式的数据集合,按照命名的列来组织存储。它在概念上与关系数据库中的表或 R 语言中的 data frame 等价,但在底层提供了更多的优化。

DataFrame 可以由大量的方式创建,例如结构化的数据文件、Hive 表、外部数据库和现有的本地 R 数据框等。

SparkR 的入口点与传统 Spark 应用类似,都是 SparkContext,它将 R 程序与 Spark 集群连接在一起。

sc 代表了 Spark Context, sqlContext 代表了 SQL Context,后者是 SQL 查询相关的程序入口。

你需要以下面的方式来创建SQL Context这个程序入口。

sqlContext <- sparkR.session(sc)

Spark 基础之 SparkR 快速上手

通过创建 Spark Context ,你可以指定应用的名称、Spark 集群的地址和需要依赖的外部包等。此外,在某些时候我们会用到 SQL Context 来操作 DataFrame 。由于在 SparkR 的启动过程中已经创建了二者,我们不再对其进行更加深入的介绍。

3.1.1 创建 DataFrame

我们知道,DataFrame 支持的数据源可以是本地的文件、Hive表和本地 R 数据框等。

此处我们选择基于本地数据框来创建 SparkR ,其他的创建方式你可以查阅 SparkR 的官方文档,文档地址已在实验末给出。

具体而言,从本地数据框来创建 DataFrame 需要用到 createDataFrame 函数,它负责将本地的 R 语言中的数据框转换为 SparkR 中的 DataFrame 。该函数需要两个参数,首先是一个 SQL Context 对象,其次是待转换的 R 语言的数据块。

请在 SparkR 的 Shell 中输入下面的代码。

df <- createDataFrame(sqlContext, faithful)

Spark 基础之 SparkR 快速上手

sqlContext 是刚刚创建的,这里的 faithful 是 R 语言内置的一个数据集,记录了一个间歇泉的爆发时间和持续时间。

接着可以通过 head 函数来得到 DataFrame 的内容并输出。

head(df)

Spark 基础之 SparkR 快速上手

在任何时候,如果系统的提示信息占据了 Shell 版面,没有输入代码的地方,只需要再输入一个回车,即可得到新的输入行。

3.1.2 常用 DataFrame 操作

SparkR 中的 DataFrame 支持大量的可用于处理结构化数据的函数。下面给出一些最基本的例子。

为了掌握更加详尽的 DataFrame 知识和操作方法,你可以查阅 API 手册,同时推荐你学习以下课程:

(1)选取行和列

在上一步里,我们创建了一个名为 df 的 DataFrame 。直接键入其名称可以查看各个字段的名称和类型。

df

Spark 基础之 SparkR 快速上手

下面选取名为 eruptions 的列。不要忘记 head 函数的作用是什么。在 select 函数中填写要从哪里选取,选取的列是什么。此处的语法特性是完全与 R 语言一致的。

head(select(df, df$eruptions))

执行结果如下:

Spark 基础之 SparkR 快速上手

当然,你也可以直接将列名写成字符串的形式作为参数。

head(select(df, "eruptions"))

Spark 基础之 SparkR 快速上手

执行结果与上个命令相同。

如果需要对 DataFrame 进行过滤,使选取结果只保留等待时间(waiting time)小于 50 分钟的结果,则需要使用 filter 函数。

head(filter(df, df$waiting < 50))

执行结果如下,结果的 wating 字段的值均小于 50 。

Spark 基础之 SparkR 快速上手

(2) 分组和聚集

SparkR 的 DataFrame 支持大量的通用函数,例如分组后的聚集。下面我们就来计算一下这个数据集中关于 waiting 字段的统计数据。

head(summarize(groupBy(df, df$waiting), count = n(df$waiting)))

n(df$waiting) 中的 n 操作符用于统计每个等待时间(waiting)的数量。

执行结果如下:

Spark 基础之 SparkR 快速上手

waiting_counts <- summarize(groupBy(df, df$waiting), count = n(df$waiting))
head(arrange(waiting_counts, desc(waiting_counts$count)))

执行结果如下:

Spark 基础之 SparkR 快速上手

(3) 列操作

SparkR 也提供了大量直接作用于数据中的列的函数。下面的这个例子展示了如何使用简单的算术关系。

df$waiting_secs <- df$waiting * 60
head(df)

上述代码的作用是将 waiting 的时间单位由小时转换成秒。需要注意的是我们仍然可以将这个新的列分配到之前的同一个 DataFrame 里。

执行结果如下:

Spark 基础之 SparkR 快速上手

3.1.3 在 SparkR 上运行 SQL 查询

SparkR 中的 DataFrame 可以像 Spark SQL 一样,注册为一个临时表。将 DataFrame 作为表对待之后,你可以对它进行一些 SQL 查询。

这种特性允许你编写的应用以固定的方式对 DataFrame 进行查询,并且返回的查询结果也是 DataFrame 。

下面通过一个简单的例子来学习该方法。

首先是加载 JSON 文件。

people <- read.df(sqlContext,"/opt/spark-2.1.1-bin-hadoop2.7/examples/src/main/resources/people.json","json")

Spark 基础之 SparkR 快速上手

将 DataFrame 注册为临时表。

registerTempTable(people, "people")

Spark 基础之 SparkR 快速上手

通过 sql 函数运行 SQL 查询语句,并使用 head 函数查看结果。

teenagers <- sql(sqlContext, "SELECT name FROM people WHERE age >= 13 AND age <= 19")

head(teenagers)

查询的结果如下:

Spark 基础之 SparkR 快速上手

3.1.4 在 SparkR 上实现机器学习

SparkR 通过 glm() 函数来生成线性模型。GLM 为广义线性模型,用于满足广义线性模型,指定给一个象征性的描述线性预测误差分布的描述。而在底层实现上, SparkR 使用 MLlib 来针对特定的族数据集训练模型。

因此,高斯和二项式族是被 MLlib 所支持的。诸如 ~.:+- 等的操作符,在模型拟合过程中是允许使用的。由于篇幅所限,此处不再对上述操作符进行更加详细的解释,你可以自行搜索相关的资料。

summary() 函数可以计算出 glm() 函数产生的模型的一些统计信息。

如果需要对 R 语言中的 glm() 函数有更多的了解,我们推荐阅读下面的资料:

接下来的两个例子将展示如何通过 SparkR,构建高斯广义线性模型和二项式广义线性模型。

(1) 高斯 GLM 模型

这次使用的数据集为 iris ,是一个鸢尾花数据集。输入 iris 即可看到详细信息,如下图所示。

Spark 基础之 SparkR 快速上手

利用该数据集创建 DataFrame。

df <- createDataFrame(sqlContext, iris)

Spark 基础之 SparkR 快速上手

利用高斯 GLM 模型训练该数据集。

model <- glm(Sepal_Length ~ Sepal_Width + Species, data = df, family = "gaussian")

Spark 基础之 SparkR 快速上手

利用 summary 函数查看结果。该结果与 R 语言内置的 glm() 返回的结果类似。

summary(model)

执行结果如下:

Spark 基础之 SparkR 快速上手

最后基于此模型给出预测结果。

predictions <- predict(model, newData = df)
head(select(predictions, "Sepal_Length", "prediction"))

最后的预测结果为:

Spark 基础之 SparkR 快速上手

(2) 二项式 GLM 模型

创建 DataFrame。

df <- createDataFrame(sqlContext, iris)

Spark 基础之 SparkR 快速上手

将其中物种为 setosa 的条目过滤出来,作为训练集。

training <- filter(df, df$Species != "setosa")

Spark 基础之 SparkR 快速上手

然后利用二项式 GLM 模型来训练数据集。

model <- glm(Species ~ Sepal_Length + Sepal_Width, data = training, family = "binomial")

Spark 基础之 SparkR 快速上手

利用 summary 函数查看结果。返回的模型系数与 R 语言原生的 glm() 函数产生的结果类似。

summary(model)

Spark 基础之 SparkR 快速上手

3.2 实例:在 SparkR 中实现时间序列分析

时间序列分解就是将时间序列按趋势性、季节性、周期性和不规则性依次分解。其中,趋势部分代表的是长期趋势,季节性指的是时间序列数据呈现季节性波动,周期性指的是数据呈现周期性波动,不规则部分就是残差。

下面我们尝试使用 SparkR 来完成这个时间序列分析的任务。实验中使用的数据是 R 语言内置的数据集 —— AirPassengers 。该数据集是由 Box & Jenkins 国际航班的乘客数据组成,时间跨度为 1949 年到 1960 年,包含 144 个观测值。

下面请在 SparkR 中输入下面的代码。

将数据预处理成月度数据。 ts 函数式专用于处理时间序列类型数据的函数, frequency 即为时间尺度。

apts <- ts(AirPassengers, frequency=12)

Spark 基础之 SparkR 快速上手

使用函数 decompose() 分解时间序列:

f <- decompose(apts)

Spark 基础之 SparkR 快速上手

查看季度数据:

f$figure

执行结果如下图所示。

Spark 基础之 SparkR 快速上手

接着,使用当前的时间区域给月份赋予名称:

monthNames <- months(ISOdate(2011,1:12,1))

Spark 基础之 SparkR 快速上手

使用月份名称标记 x 轴。 side=1 表示设置 x 轴, at 指的是范围从 10 到 12, las 表示分割的单位刻度为 2

注意:实验楼环境有限,各位同学在本地环境中可以尝试通过plot()函数将数据集画出来

四、实验总结

本课程较为详细地介绍了 SparkR 的背景和常用操作。SparkR 作为一个新兴的 R 语言应用平台,在面对大规模数据时,通常更能够显现出其优势。

在后续的课程中,我们还会继续介绍如何通过 RStudio 链接到 SparkR 并使用其中的 API 来进行计算。

以上为本课程的全部内容,如果你在学习的过程中有任何的疑问或者建议,欢迎到实验楼的讨论区与我们交流。

参考链接


以上所述就是小编给大家介绍的《Spark 基础之 SparkR 快速上手》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员的自我修养

程序员的自我修养

俞甲子、石凡、潘爱民 / 电子工业出版社 / 2009-4 / 65.00

这本书主要介绍系统软件的运行机制和原理,涉及在Windows和Linux两个系统平台上,一个应用程序在编译、链接和运行时刻所发生的各种事项,包括:代码指令是如何保存的,库文件如何与应用程序代码静态链接,应用程序如何被装载到内存中并开始运行,动态链接如何实现,C/C++运行库的工作原理,以及操作系统提供的系统服务是如何被调用的。每个技术专题都配备了大量图、表和代码实例,力求将复杂的机制以简洁的形式表......一起来看看 《程序员的自我修养》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具