Spark SQL编程基本概述及使用

Spark SQL概述

Spark SQL是Spark用来处理结构化数据的一个模块,它提供了2个编程抽象:DataFrame和DataSet,并且作为分布式SQL查询引擎的作用。

在Hive中,它是将Hive SQL转换成MapReduce然后提交到集群上执行,大大简化了编写MapReduc的程序的复杂性,由于MapReduce这种计算模型执行效率比较慢。所有Spark SQL的应运而生,它是将Spark SQL转换成RDD,然后提交到集群执行,执行效率非常快!

Spark SQL的特点
1)易整合

2)统一的数据访问方式

3)兼容Hive

4)标准的数据连接

DataFrame
与RDD类似,DataFrame也是一个分布式数据容器。然而DataFrame更像传统数据库的二维表格,除了数据以外,还记录数据的结构信息,即schema。同时,与Hive类似,DataFrame也支持嵌套数据类型(struct、array和map)。从API易用性的角度上看,DataFrame API提供的是一套高层的关系操作,比函数式的RDD API要更加友好,门槛更低。

在这里插入图片描述

上图直观地体现了DataFrame和RDD的区别。左侧的RDD[Person]虽然以Person为类型参数,但Spark框架本身不了解Person类的内部结构。而右侧的DataFrame却提供了详细的结构信息,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。DataFrame是为数据提供了Schema的视图。可以把它当做数据库中的一张表来对待,DataFrame也是懒执行的。性能上比RDD要高,主要原因:
优化的执行计划:查询计划通过Spark catalyst optimiser进行优化。
在这里插入图片描述
DataSet
1)是Dataframe API的一个扩展,是Spark最新的数据抽象。
2)用户友好的API风格,既具有类型安全检查也具有Dataframe的查询优化特性。
3)Dataset支持编解码器,当需要访问非堆上的数据时可以避免反序列化整个对象,提高了效率。
4)样例类被用来在Dataset中定义数据的结构信息,样例类中每个属性的名称直接映射到DataSet中的字段名称。
5) Dataframe是Dataset的特列,DataFrame=Dataset[Row] ,所以可以通过as方法将Dataframe转换为Dataset。Row是一个类型,跟Car、Person这些的类型一样,所有的表结构信息都用Row来表示。
6)DataSet是强类型的。比如可以有Dataset[Car],Dataset[Person].
7)DataFrame只是知道字段,但是不知道字段的类型,所以在执行这些操作的时候是没办法在编译的时候检查是否类型失败的,比如你可以对一个String进行减法操作,在执行的时候才报错,而DataSet不仅仅知道字段,而且知道字段类型,所以有更严格的错误检查。就跟JSON对象和类对象之间的类比。

SparkSQL编程

SparkSession新的起始点
在老的版本中,SparkSQL提供两种SQL查询起始点:一个叫SQLContext,用于Spark自己提供的SQL查询;一个叫HiveContext,用于连接Hive的查询。
SparkSession是Spark最新的SQL查询起始点,实质上是SQLContext和HiveContext的组合,所以在SQLContext和HiveContext上可用的API在SparkSession上同样是可以使用的。SparkSession内部封装了sparkContext,所以计算实际上是由sparkContext完成的。

DataFrame

创建
在Spark SQL中SparkSession是创建DataFrame和执行SQL的入口,创建DataFrame有三种方式:通过Spark的数据源进行创建;从一个存在的RDD进行转换;还可以从Hive Table进行查询返回。
1)从Spark数据源进行创建
(1)查看Spark数据源进行创建的文件格式

# 输入spark.read.按Tab键
scala> spark.read.
csv      initializeForcefully   json   option    orc       schema   text       
format   jdbc                   load   options   parquet   table    textFile

(2)读取json文件创建DataFrame

scala> val df = spark.read.json("/hyk/spark/person.json")
df: org.apache.spark.sql.DataFrame = [age: bigint, name: string] 

(3)展示结果

scala> df.show
+---+------+
|age|  name|
+---+------+
| 25|  张三|
| 26|李思思|
| 24|  王五|
| 21|  赵六|
+---+------+

SQL风格语法(主要)
1)创建一个DataFrame

scala> val df = spark.read.json("/hyk/spark/person.json")
df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]

2)对DataFrame创建一个临时表

scala> df.createOrReplaceTempView("people")

3)通过SQL语句实现查询全表

scala> val sqlDF = spark.sql("SELECT * FROM people")
sqlDF: org.apache.spark.sql.DataFrame = [age: bigint, name: string]

4)结果展示

scala> sqlDF.show
+---+------+
|age|  name|
+---+------+
| 25|  张三|
| 26|李思思|
| 24|  王五|
| 21|  赵六|
+---+------+

注意:临时表是Session范围内的,Session退出后,表就失效了。如果想应用范围内有效,可以使用全局表。注意使用全局表时需要全路径访问,如:global_temp.people

5)对于DataFrame创建一个全局表

scala> df.createGlobalTempView("people")

如果报错:The root scratch dir: /tmp/hive on HDFS should be writable. Current permissions are: rwx------
解决如下

[root@node01 spark]# hadoop fs -chmod 777 /tmp/hive
[root@node01 spark]# hadoop fs -rm -r /tmp/hive
20/03/08 20:12:27 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes.
Deleted /tmp/hive
[root@node01 spark]# rm -rf /tmp/hive

6)通过SQL语句实现查询全表

scala>  spark.sql("SELECT * FROM global_temp.people").show()
+---+------+
|age|  name|
+---+------+
| 25|  张三|
| 26|李思思|
| 24|  王五|
| 21|  赵六|
+---+------+
scala> spark.newSession().sql("SELECT * FROM global_temp.people").show()
+---+------+
|age|  name|
+---+------+
| 25|  张三|
| 26|李思思|
| 24|  王五|
| 21|  赵六|
+---+------+

DSL风格语法
1)创建一个DateFrame

scala> val df = spark.read.json("/hyk/spark/person.json")
df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]

2)查看DataFrame的Schema信息

scala>  df.printSchema
root
 |-- age: long (nullable = true)
 |-- name: string (nullable = true)

3)只查看”name”列数据

scala> df.select("name").show()
+------+
|  name|
+------+
|  张三|
|李思思|
|  王五|
|  赵六|
+------+

4)查看”name”列数据以及”age+1”数据

scala>  df.select($"name", $"age" + 1).show()
+------+---------+
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值