Spark-SQL

Spark-SQL

Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。

Hive and SparkSQL

,SparkSQL 可以简化 RDD 的开发,提高开发效率,且执行效率非常快,所以实际工作中,基本上采用的就是 SparkSQL。Spark SQL 为了简化 RDD 的开发, 提高开发效率,提供了 2 个编程抽象,类似 Spark Core 中的 RDD

➢ DataFrame

➢ DataSet

 Spark-SQL 特点

易整合。无缝的整合了 SQL 查询和 Spark 编程

统一的数据访问。使用相同的方式连接不同的数据源

兼容 Hive。在已有的仓库上直接运行 SQL 或者 HQL

 标准数据连接。通过 JDBC 或者 ODBC 来连接

 DataFrame 是什么

在 Spark 中,DataFrame 是一种以 RDD 为基础的分布式数据集,类似于传统数据库中 的二维表格。

 DataSet 是什么

DataSet 是分布式数据集合。DataSet 是 Spark 1.6 中添加的一个新抽象,是 DataFrame 的一个扩展。它提供了 RDD 的优势(强类型,使用强大的 lambda 函数的能力)以及 Spark SQL 优化执行引擎的优点。DataSet 也可以使用功能性的转换(操作 map,flatMap,filter 等等)

创建 DataFrame

在 Spark SQL 中 SparkSession 是创建 DataFrame 和执行 SQL 的入口,创建 DataFrame

有三种方式:通过 Spark 的数据源进行创建;从一个存在的 RDD 进行转换;还可以从 Hive

Table 进行查询返回。

读取 json 文件创建 DataFrame

val df = spark.read.json("data/user.json")

      对 DataFrame 创建一个临时表

df1.createOrReplaceTempView("people")

   通过 SQL 语句实现查询全表

val sqlDF = spark.sql("select * from people")

展示数据:

df.show

Spark-SQL_第1张图片

   对于 DataFrame 创建一个全局表

df1.createGlobalTempView("people1")

通过 SQL 语句实现查询全表

spark.sql("SELECT * FROM global_temp.people1").show()

spark.newSession().sql("SELECT * FROM global_temp.people1").show()

DSL 语法

查看 DataFrame 的 Schema 信息

df.printSchema

只查看"username"列数据

df.select("username").show

查看"username"列数据以及"age+1"数据

注意:涉及到运算的时候, 每列都必须使用$, 或者采用引号表达式:单引号+字段名

df.select($"username",$"age" + 1).show

df.select('username, 'age + 1).show()

查看"age"大于"18"的数据

df.filter($"age">18).show

按照"age"分组,查看数据条数

df.groupBy("age").count.show

创建 DataSet

case class Person(name: String, age: Long)

val caseClassDS = Seq(Person("zhangsan",2)).toDS()

caseClassDS.show

val ds = Seq(1,2,3,4,5).toDS

ds.show

RDD 转换为 DataSet

SparkSQL 能够自动将包含有 case 类的 RDD 转换成 DataSet,case 类定义了 table 的结 构,case 类属性通过反射变成了表的列名。Case 类可以包含诸如 Seq 或者 Array 等复杂的结构。

RDD、DataFrame、DataSet 三者的关系

在 SparkSQL 中 Spark 为我们提供了两个新的数据抽象,分别是 DataFrame 和 DataSet。他们 和 RDD 有什么区别呢?

首先从版本的产生上来看:

➢ Spark1.0 => RDD

➢ Spark1.3 => DataFrame

➢ Spark1.6 => Dataset

如果同样的数据都给到这三个数据结构,他们分别计算之后,都会给出相同的结果。不

同是的他们的执行效率和执行方式。在后期的 Spark 版本中,DataSet 有可能会逐步取代 RDD和 DataFrame 成为唯一的 API 接口。

三者的共性

➢ RDD、DataFrame、DataSet 全都是 spark 平台下的分布式弹性数据集,为处理超大型数

据提供便利;

➢ 三者都有惰性机制,在进行创建、转换,如 map 方法时,不会立即执行,只有在遇到

Action 如 foreach 时,三者才会开始遍历运算;

➢ 三者有许多共同的函数,如 filter,排序等;

➢ 在对 DataFrame 和 Dataset 进行操作许多操作都需要这个包:

import spark.implicits._(在创建好 SparkSession 对象后尽量直接导入)

➢ 三者都会根据 Spark 的内存情况自动缓存运算,这样即使数据量很大,也不用担心会

内存溢出

➢ 三者都有分区(partition)的概念

➢ DataFrame 和 DataSet 均可使用模式匹配获取各个字段的值和类型

你可能感兴趣的:(spark,大数据,分布式)