首页 理论教育 使用RDD构建DataFrame的实现方法

使用RDD构建DataFrame的实现方法

时间:2023-07-02 理论教育 版权反馈
【摘要】:具体的结构化文件、Hive表、外部数据库的相关加载可以参考其他章节,这里主要介绍如何通过RDD来构建DataFrame。Spark SQL支持两种方式将存在的RDD转化为DataFrame。3)通过SQLContext提供的createDataFrame方法将模式应用到RDD上。RDD+DataFrame+DataSet最终会形成三足鼎立的局面。接下来示范如何通过编程接口来实现RDD与DataFrame的转换。3)使用Scala实践RDD与DataFrame的转换。

使用RDD构建DataFrame的实现方法

DataFrame可以从结构化文件、Hive表、外部数据库及RDD加载构建得到。具体的结构化文件、Hive表、外部数据库的相关加载可以参考其他章节,这里主要介绍如何通过RDD来构建DataFrame。

Spark SQL支持两种方式将存在的RDD转化为DataFrame。

第一种:使用反射来推断包含特定对象类型的RDD的模式(Schema)。适用对已知数据结构的RDD转换,基于反射的方式,代码比较简洁。

第二种:是通过一个编程接口来实现的,这个接口允许构造一个模式,然后在存在的RDD上使用它。虽然这种方法代码较为冗长,但是它允许在运行期间不知道列及列类型的情况下构造DataFrame。

下面对这两种方式做进一步解释。

1.利用反射推断模式

Spark SQL能够将含Row对象的RDD转换成DataFrame,并推断数据类型。通过将一个键值对(key/value)列表作为kwargs传给Row类来构造Rows。key定义了表的列名,类型通过第一列数据来推断(所以这里RDD的第一列数据不能有缺失)。未来版本中将会通过看更多数据来推断数据类型,就像现在对JSON文件的处理一样。

2.编程指定模式

通过编程指定模式需要3步:

1)从原来的RDD创建一个元组或列表的RDD。

2)用StructType创建一个和步骤1)中创建的RDD中元组或列表的结构相匹配的模式。

3)通过SQLContext提供的createDataFrame方法将模式应用到RDD上。

动态构造有时候有些麻烦,但是Spark已经提供了一个API,就是DataSet,DataSet可以基于RDD,RDD里面有类型,这样就可以实现RDD与DataFrame的转换。

RDD+DataFrame+DataSet最终会形成三足鼎立的局面。从Spark 2.0开始,会大量使用DataSet,因为DataSet上可以直接查询,操作起来也会非常直观方便。DataSet的底层是钨丝计划,提供了更优的性能改进,DataSet的目标是要所有的子框架都用DataSet来进行计算。

接下来示范如何通过编程接口来实现RDD与DataFrame的转换。

1)首先准备数据

准备的数据文件如下,是名为persons.txt的文本文件。

1001,张三,18

1002,李四,19(www.xing528.com)

……

1098,王五,28

1099,赵六,20

数据格式如下:

●第一列为ID。

●第二列是姓名。

●第三列是年龄。

2)使用Java实践RDD与DataFrame的转换。

在Spark SQL中建议使用HiveContext来替代SQLContext它比SQLContext功能更强

以上Java代码实现了RDD与DataFrame的转换,非常简单,主要涉及以下步骤:

●读取文本文件,遍历全部行,创建RDD<Row>。

●构造DataFrame的元数据(MetaData)。

●基于MetaData、RDD<Row>来构造DataFrame。

●注册成为临时表。

●使用上面的临时表,进行数据查询。

●对结果进行处理:DataFrame转换成为RDD<Row>或者持久化。

3)使用Scala实践RDD与DataFrame的转换。

以上通过Scala代码实现了上面Java代码一样的效果,具体实现步骤也基本一致。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈