通过SQL语句处理数据的前提是需要创建一张表,在Spark SQL中表被定义DataFrame,它由两部分组成:表结构的Schema和数据集合RDD,下图说明了DataFrame的组成。
从图中可以看出RDD是一个Java对象的数据集合,而DataFrame增加了Schema的结构信息。因此可以把DataFrame看成是一张表,而DataFrame的表现形式也可以看成是RDD。DataFrame除了具有RDD的特性以外,还提供了更加丰富的算子,并且还提升执行效率、减少数据读取以及执行计划的优化。
视频讲解如下:
Spark中的DataFrame |
【赵渝强老师】Spark中的DataFrame |
创建DataFrame主要可以通过三种不同的方式来进行创建,这里还是以的员工数据的csv文件为例。文件内容如下:
下面分别举例进行说明如何使用spark-shell在Spark SQL中创建DataFrame。
一、使用case class定义DataFrame表结构
Scala中提供了一种特殊的类,用case class进行声明,中文也可以称作“样本类”。样本类是一种特殊的类,经过优化以用于模式匹配。样本类类似于常规类,带有一个case 修饰符的类,在构建不可变类时,样本类非常有用,特别是在并发性和数据传输对象的上下文中。在Spark SQL中也可以使用样本类来创建DataFrame的表结构。
(1)定义员工表的结构Schema。
(2)将员工数据读入RDD。
(3)关联RDD和Schema。
(4)生成DataFrame。
(5)查询员工表中的数据,结果如下图所示。
二、使用StructType定义DataFrame表结构
Spark 提供了StructType用于定义结构化的数据类型,类似于关系型数据库中的表结构。通过定义StructType,可以指定数据中每个字段的名称和数据类型,从而更好地组织和处理数据。
(1)导入需要的类型.
(2)定义表结构。
(3)将数据读入RDD。
(4)将RDD中的数据映射成Row对象。
(5)创建DataFrame。
三、直接加载带格式的数据文件
Spark提供了结构化的示例数据文件,利用这些结构化的数据文件可以直接创建DataFrame,这些文件位于Spark安装目录下的/examples/src/main/resources中。下面是提供的people.json文件中的数据内容。
由于数据源文件本身就具有格式,因此可以直接创建DataFrame。下面是具体的步骤。
(1)为了便于操作,将people.json文件复制到用户的HOME目录下
(2)直接创建DataFrame。这里加载的文件在本地目录,也可以是HDFS。
(3)执行一个简单的查询,如下图所示。