一、Spark SQL与Hive异同
- 1- 都是分布式计算的引擎
- 2- 都可以处理大规模的数据, 都限定结构化数据
- 3- 都可以基于Yarn集群运行
不同点:
- 1- Spark SQL是基于内存计算, 而Hive SQL是基于磁盘来进行计算的
- 2- Spark SQL没有元数据管理的服务(自己维护), 而Hive SQL是有metastore的元数据管理服务项
- 3- Spark SQL底层执行Spark RDD程序, 而Hive SQL底层执行MR
- 4- Spark SQL可以编写SQL 也可以编写代码, 但是HIVE SQL仅能编写SQL语句
二、Spark SQL的数据结构对比
RDD: 存储直接就是对象, 比如在图中, 存储的就是一个皮尔斯同的对象, 但是里面有什么数据,不太清楚
dataFrame: 将person中各个字段的数据, 进行格式化存储, 形成一个dataFrame, 可以直接看到数据
dataSet: 将Preston对象中数据都按照结构化的方式存储好, 同时保留对象的类型, 从而知道来源于那一个person的对象
由于Python不支持泛型, 所以无法使用dataSet类型, 客户端仅支持dataFrame类型
三、 Spark SQL的统一入口类
代码如下(示例):
#!/usr/bin/env python
# @desc :
__coding__ = "utf-8"
__author__ = "itcast team"
from pyspark import SparkContext, SparkConf
import os
# 锁定远端操作环境, 避免存在多个版本环境的问题
from pyspark.sql import SparkSession
os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/root/anaconda3/bin/python"
# 快捷键: main 回车
if __name__ == '__main__':
print("演示: 如何构建SparkSession对象")
# 1. 创建SparkSession对象
spark = SparkSession.builder.master('local[*]').appName('init').getOrCreate();
# 获取原有的SparkContext对象
sc = spark.sparkContext
# 释放资源
sc.stop()
spark.stop()
入门案例
stu_score.txt
1 语文 99
2 语文 99
3 语文 99
4 语文 99
5 语文 99
6 语文 99
7 语文 99
8 语文 99
9 语文 99
10 语文 99
11 语文 99
12 语文 99
13 语文 99
14 语文 99
15 语文 99
#!/usr/bin/env python
# @desc :
__coding__ = "utf-8"
__author__ = "itcast team"
from pyspark import SparkContext, SparkConf
import os
# 锁定远端操作环境, 避免存在多个版本环境的问题
from pyspark.sql import SparkSession
os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/root/anaconda3/bin/python"
# 快捷键: main 回车
if __name__ == '__main__':
spark = SparkSession.builder.appName("test").master("local[*]").getOrCreate()
sc = spark.sparkContext
df = spark.read.csv("file:///export/data/workspace/ky07_spark_parent/_03_spark_sql/data/stu_score.txt",sep = " ", header=False)
df2 = df.toDF("id", "name", "score")
df2.printSchema()
df2.createTempView("score")
spark.sql("""
select * from score where name='语文' limit 5""").show()
结果如下
四、 DataFrame基本介绍
一个dataFrame表示是一个二维的表, 一个二维表, 必然存在 行 列 表结构描述信息
表结构描述信息(元数据): StructType
字段: StructField
定义: 字段的名称, 字段的类型, 字段是否可以为null
认为: 在一个StructType对象下, 是由多个StructField组成的, 构建了一个完整的元数据信息
行: ROW对象
列: Column对象
注意: dataFrame本质上就是一个RDD, 只是对RDD进行包装, 在其基础上添加Schema元数据信息, 从而处理结构化数据
五、dataFrame的相关API
操作dataFrame一般有二种操作的方式, 一种为SQL方式, 另一种为DSL方式
SQL方式: 通过编写SQL语句完成统计分析操作
DSL方式: 领域特定语言 指的通过DF的特有API完成计算操作(通过代码形式)
从使用角度来看: SQL可能更加的方便一些, 当适应DSL写法后, 你会发现DSL要比SQL更加好用(类似于面向过程编程)
Spark的官方角度: 推荐使用DSL方案
关于DSL相关的API:
-
show(参数1,参数2): 用于展示DF中的数据, 默认仅展示前20行
- 参数1: 默认是20, 控制展示多少行
- 参数2: 是否阶段列, 默认只输出20个字符的长度, 过长不显示, 要显示的话, 请输入: truncate=True
- 一般这两个参数很少会设置
-
printSchema(): 用于打印当前这个df的表结构信息
-
select() 类似于SQL语句中select, SQL中select后面可以写啥, API也是同样可以实现的
-
filter/where(): 用于对数据进行过滤操作, 一般在Spark SQL中主要使用where
-
groupBy() 用于执行分组
-
orderBy() 用于执行排序
-
……
注意:
Spark SQL的DSL API 都是非常简单的, 基本上与SQL的关键词保持一致, 一般大家认为DSL比较难的地址: 不知道该如何传递参数, 因为DSL API的参数变化多样, 每个函数支持的参数方式也不一样
DSL主要支持以下几种传递的方式: 列表 | str | column
str格式: '字段'
column对象:
df对象中包含的字段: df['字段']
执行过程中新产生的字段: F.col('字段')
列表:
['字段1','字段2','字段3'...]
[column1,column2,column3...]
如何识别对应的API支持哪几种传递方式呢?
总结
Spark可以使用标准SQL语言, 也可以使用代码. 同时支持混合使用