Spark DataFrame及RDD与DataSet转换成DataFrame
一、什么是DataFrame
DataFrame和RDD一样,也是Spark的一种弹性分布式数据集,它是一个由列组成的数据集,概念上等同于关系型数据库中的一张表。DataFrame可以从非常宽泛的数据源中的构建,比如结构化的数据文件,Hive中的表,外部数据库,或者已经创建好的RDDs等等。在Scala和Java中,DataFrame由行数据集表示。在Scala API中,DataFrame 可以简单看成DataSer[Row],而在Java API中,使用DataSet<Row>表示DataFrame。有人肯定会问,已经有了弹性分布式数据集RDD,为什么还要引入DataFrame呢?因为在Spark中,我们可以像在关系型数据库中使用SQL操作数据库表一样,使用Spark SQL操作DataFrame。这让熟悉关系型数据库SQL人员也能轻松掌握。
二、创建DataFrame
首先导入Spark Core、Spark SQL、和Hadoop Client,pom.xml文件如下:
下面使用三种方式创建DataFrame
itemdata.data文件数据格式如下:
第一列是user_id,第二列是item_id,第三列是score。
1、以csv格式读取文件
步骤:
(1)使用SparkSesstion创建Spark SQL的切入点spark,
(2)spark以csv格式读取HDFS文件系统/input/mahout-demo/目录下的文件itemdata.data,
读取的结果就是是DataFrame数据集,程序如下:
运行结果如下:
默认DataFrame的列名为_cn(n=0,1,2.……)。后面我们会说明如何指定列名
2、以一般格式读取文件
同样使用创建好的spark切入点,调用textFile函数读取文件itemdata.data,生成的是DataSet数据集,数据文件的每一行内容作为整体是DataSet的一列,首先需要map算子将数据按“,”分词,得到三个元素的数组作为整体,再次使用map将数组编程具有三列的DataSet,最后使用toDF()函数将其转换成DataFrame数据集,这里我们在toDF()函数中指明了每个列的列名。程序如下:
程序运行结果:
3、以SparkContext作为切入点读取文件
Spark SQL的切入点SparkSesstion封装了Spark Core的切入点SparkContext,所以SparkContext对象可以由SparkSesstion创建。SparkContext读取文件生成的是RDD数据集,转换如下:
程序运行结果
DataFrame的列名默认为_n(n=1,2,3,……)。
4、指定列名
通过定义case class Data实体类,为DataFrame每个列指定列名,代码如下:
三种方式程序运行结果都是:
注:关于切入点的问题,其实需要搞清楚Spark的组成,它主要有五个部分组成:
(1)Spark Core
Spark核心部分,操作RDD数据集
(2)Spark SQL
像关系型数据一样,使用SQL操作DataFrame数据集
(3)Spark Streaming
实时数据流处理
(4)Spark MLlib
机器学习算法库
(5)GraphX
图计算
三、Spark SQL操作DataFrame
1、创建临时视图
基本步骤:
(1)创建DataFrame
(2)由DataFrame创建临时视图
(3)写Spark SQL操作临时视图
代码如下:
我们创建DataFrame后,创建了一个名为data的临时视图(SparkSession关闭后,临时视图立即会失效),然后写了Spark SQL查询评分大于10分的所有行,并打印前3行。运行结果如下:
2、创建全局临时视图
首先我们创建了一张全局临时视图,然后使用Spark SQL查询视图。注意全局临时视图存放在系统隐藏的数据库global_temp中,访问data临时视图时需要使用global_temp.data。全局临时视图,在一个Spark Sesstion关闭后,其他的Spark Sesstion可以继续使用,知道Spark应用被关闭。
程序运行结果
3、不创建临时视图
如下:
程序运行结果如下: