本文为您介绍Spark SQL、Dataset和DataFrame相关的概念,以及Spark SQL的基础操作。

Spark SQL、Dataset和DataFrame介绍

Spark SQL是一个用于结构化数据处理的Spark模块,与基本的Spark RDD的API不同,Spark SQL的接口还提供了更多关于数据和计算的结构化信息。Spark SQL可以用于执行SQL查询并从Hive表中读取数据。

Dataset是数据的分布式集合。Dataset是Spark 1.6中添加的一个新接口,它集成了RDD和Spark SQL的优点,可以从JVM对象构造数据集,然后使用函数转换(Map、FlatMap或Filter等)进行操作。Dataset API有Scala和Java两种版本。Python和R不支持Dataset API,但是由于Python和R的动态特性,Dataset API的许多优点已经可用。

DataFrame是组织成命名列的Dataset。他在概念上相当于关系数据库中的一个表,或R和Python中的一个DataFrame,但是进行了更丰富的优化。DataFrame可以从一系列广泛的源构建,例如:结构化数据文件、Hive中的表、外部数据库或现有RDD。DataFrame API有Scala、Java、Python和R版本。在Scala和Java中,DataFrame由行数据集表示。在Scala API中,DataFrame只是Dataset[Row]的类型别名,而在Java API中,您需要使用Dataset<Row>来表示数据帧。

Spark SQL基础操作

Spark SQL支持直接通过SQL语句操作数据,而Spark会将SQL进行解析、优化并执行。

以下示例展示了如何使用Spark SQL进行读取文件。示例如下:
  • 示例1:Spark支持多种数据格式,本示例读取了JSON格式文件的数据,并输出为Parquet格式。
    val peopleDF = spark.read.json("examples/src/main/resources/people.json")
    peopleDF.write.parquet("people.parquet")
  • 示例2:通过SQL从parquetFile表中读出年龄在13岁到19岁之间的年轻人的名字,并转化为DataFrame,随后通过Map操作将名字转化为一个可读的形式并输出。
    val namesDF = spark.sql("SELECT name FROM parquetFile WHERE age BETWEEN 13 AND 19")
    namesDF.map(attributes => "Name: " + attributes(0)).show()