天天看点

Apache Spark机器学习.2.5 数据集连接

<b>2.5 数据集连接</b>

<b></b>

本节,我们将介绍数据连接的技术,并讨论spark处理数据连接的特有的特征,以及一些使工作更容易进行的数据连接解决方案。

学习完本节,我们将有能力按照各类机器学习需要做数据连接。

2.5.1 数据连接及其工具——spark sql

为机器学习项目准备数据集时,我们一般需要组合多个数据集。关系表通过主键和外键进行连接。

连接两个及以上的数据集听起来容易,但做起来非常有挑战,并且非常耗时。在sql语句中,select是最常用的命令。作为例子,下面是一个执行连接的典型的sql代码:

为执行上面提到的表连接任务,数据科学家和机器学习从业者经常使用他们熟悉的sql工具。在spark环境中,spark sql就是为此开发的工具。

spark sql能够让用户在spark开发环境中使用sql或 dataframe api查询结构化数据,这些在r notebook中依然可以使用。spark sql重用了hive的前端和元数据,与hive数据和查询完全兼容。

spark sql包含一个基于成本的优化器、列存储和代码生成器以生成快速的查询。同时,spark sql使用spark引擎将查询扩展到几千个节点并耗费多个小时,它支持查询过程中的容错机制。

使用spark sql时,有两个主要的组件:dataframe和sqlcontext。

正如前面讨论的,dataframe是一个组织成列的分布式数据集。它基于r语言的数据框,并与关系数据库的数据表类似。spark sql通过sqlcontext封装了所有关系函数。

2.5.2 spark中的数据集连接

这里,我们通过一些实例展示使用spark sql的方法和相关过程。

为便于分析,设想应用程序包含下面的4个数据表:

至少,我们需要将user和events两个表连接起来,使用下面的代码完成连接:

spark sql的结果以rdd的形式存储,与spark其他库交互比较少。上面返回的结果可以直接用于机器学习。

从上面的例子看到,spark sql使得为机器学习算法准备数据而进行的不同数据集连接非常方便。进一步讲,spark sql允许开发者简便地操作和连接机器学习算法的输出结果,从而生成想要的结果。

更多关于spark sql使用的信息,请访问:http://spark.apache.org/docs/1.0.0/sql-programming-guide.html。

2.5.3 使用r语言数据表程序包进行数据连接

相比以前,spark已经使得数据操作更快、数据分析更容易了。

根据spark开发团队的初衷,开发spark sql的目的是为了:

编写少量的代码

读取少量的数据

将一些困难的工作交给优化器完成

这都是通过使用dataframe和spark sql命令sqlcontext.read和 df.write实现的。

除了spark sql,data.table程序包功能非常强大,用户也可以使用r语言连接表。开发data.table程序包的主要目的是:

快速合并大量的数据(例如:内存中数据100gb),快速的排序连接

在不使用复制命令的情况下,按组快速增加/修改/删除列数据

按列进行数据表和快速的文件读取(fread)

该程序包为开发人员提供了自然和灵活的语法。

使用data.table进行连接,你首先需要创建data.frame,这非常容易。然后,使用x[y]连接两个表。

这被称为末次观测值结转(last observation carried forward,locf) 或滚动连接。

x[y]是data.table x和data.table y 两个表之间的连接。如果y有两列,第一列与x的第一列的key匹配,两个表的第二列也互相匹配。默认情况下执行equi-join,也就是值必须相等。

除了等值连接,还有滚动连接:

如前所述,y的第一列与x的第一列匹配,也就是值相等。然而,y中的最后一个连接列,即例子中的第二列,被特殊处理。在第一列匹配的情况下,如果未找到匹配项,将返回上一行的值。

其他控制包括:前滚、后滚、回滚至最近项和限时滚动。

在提示符下,输入下面的命令查看例子。

r语言data.table提供了增强版data.frame,包括:

快速合并大量数据——例如,100gb(查看一下高达20亿行的测试基准)。

快速的排序连接——例如,前滚、后滚、回滚至最近项和限时滚动。

快速的重叠范围连接——例如,genomicranges。

在2.2.3节,为便于分析我们给出了4个表:

在这个例子中,上一节我们获取了第一个数据的一个子集,然后与第四个数据汇集。现在,将它们连接在一起。如上一节,在r notebook上混合使用spark sql 和r语言,使数据连接更容易。