Spark是大数据体系的明星产品,是一款高性能的分布式内存迭代计算框架,可以处理海量规模的数据。下面就带大家来学习今天的内容!
一、SparkSQL和Hive的异同
- Hive和Spark 均是:“分布式SQL计算引擎”
- 均是构建大规模结构化数据计算的绝佳利器,同时SparkSQL拥有更好的性能
- 目前,企业中使用Hive仍旧居多,但SparkSQL将会在很近的未来替代Hive成为分布式SQL计算市场的顶级
二、SparkSQL的数据抽象
Pandas - DataFrame
- 二维表数据结构
- 单机(本地)集合
SparkCore - RDD
- 无标准数据结构,存储什么数据均可
- 分布式集合(分区)
SparkSQL - DataFrame
- 二维表数据结构
- 分布式集合(分区)
SparkSQL 其实有3类数据抽象对象
- SchemaRDD对象(已废弃)
- DataSet对象:可用于Java、Scala语言
- DataFrame对象:可用于Java、Scala、 Python 、 R
我们以Python开发SparkSQL,主要使用的就是 DataFrame对象作为核心数据结构
三、SparkSQL数据抽象的发展
从SparkSQL的发展历史可以看到:
- 14年最早的数据抽象是: SchemaRDD (内部存储二维表数据结构的RDD), SchemaRDD就是魔改的RDD,将RDD支持的存储数据,限定 为二维表数据结构用以支持SQL查询。由于是魔改RDD,只是一个过渡产品,现已废弃。
- 15年发布DataFrame对象,基于Pandas的DataFrame (模仿)独立于RDD进行实现,将数据以二维表结构进行存储并支持分布式运行
- 16年发布DataSet对象,在DataFrame之上添加了泛型的支持,用以更好的支持Java和Scala这两个支持泛型的编程语言
- 16年, Spark2.0版本,将DataFrame和DataSet进行合并。其底层均是DataSet对象,但在Python和R语言到用时,显示为DataFrame对象 。和老的DataFrame对象没有区别
四、DataFrame概述
DataFrame和RDD都是:弹性的、分布式的、数据集只是, DataFrame存储的数据结构“限定”为:二维表结构化数据,而RDD可以存储的数据则没有任何限制,想处理什么就处理什么。
五、SparkSession对象
在RDD阶段,程序的执行入口对象是: SparkContext
在Spark 2.0后,推出了SparkSession对象, 作为Spark编码的统一入口对象。
SparkSession对象可以:
- - 用于SparkSQL编程作为入口对象
- - 用于SparkCore编程,可以通过SparkSession对象中获取到SparkContext
所以,我们后续的代码,执行环境入口对象,统一变更为SparkSession对象。
现在,来体验一下构建执行环境入口对象:SparkSession
构建SparkSession核心代码
# coding:utf8
# SparkSQL 中的入口对象是SparkSession对象
from pyspark.sql import SparkSession
if __name__ == '__main__':
# 构建SparkSession对象, 这个对象是 构建器模式 通过builder方法来构建 spark = SparkSession.builder.\
appName("local[*]").\
config("spark.sql.shuffle.partitions", "4").\
getOrCreate()
# appName 设置程序名称, config设置一些常用属性
# 最后通过getOrCreate()方法 创建SparkSession对象
六、SparkSQL HelloWorld 演示
有如下数据集:列1ID,列2学科, 列3分数
数据集文件:资料\data\sql\stu_score.txt
注意:右侧代码同学们不需要练习, 只是先体验一下SparkSQL的数据处理
需求:读取文件,找出学科为“语文”的数据,并限制输出5条,where subject = '语文' limit 5
代码如下:
# coding:utf8标签:__,对象,SparkSession,DataFrame,RDD,概述,SparkSQL,第二章 From: https://blog.51cto.com/u_8238263/6022247
# SparkSQL 中的入口对象是SparkSession对象
from pyspark.sql import SparkSession
if __name__ == '__main__':
# 构建SparkSession对象, 这个对象是 构建器模式 通过builder方法来构建
spark = SparkSession.builder.\
appName("local[*]").\
config("spark.sql.shuffle.partitions", "4").\
getOrCreate()
# appName 设置程序名称, config设置一些常用属性
# 最后通过getOrCreate()方法 创建SparkSession对象
df = spark.read.csv('../data/sql/stu_score.txt', sep=',', header=False)
df2 = df.toDF('id', 'name', 'score')
df2.printSchema()
df2.show()
df2.createTempView("score")
# SQL 风格
spark.sql("""
SELECT * FROM score WHERE name='语文' LIMIT 5
""").show()
# DSL 风格
df2.where("name='语文'").limit(5).show()