Spark SQL简介-程序员宅基地

技术标签: python  Spark  

Spark SQL简介

一、从Shark说起

1、在这之前我们要先理解Hive的工作原理:
在这里插入图片描述

Hive是一个基于Hadoop的数据仓库工具,提供了类似于关系数据库SQL的查询语言——HiveSQL,用户可以通过HiveSQL语句快速实现简单的MapReduce统计,Hive自身可以自动将HiveSQL语句快速转换成MapReduce任务进行运行。

2、Shark提供了类似于Hive的功能,与Hive不同的是,Shark把SQL语句转换成Spark作业,而不是MapReduce作业。

可以近似地认为:Shark仅将物理执行计划从MapReduce作业替换成了Spark作业,也就是通过Hive的HiveSQL解析功能,把HiveSQL翻译成Spark上的RDD操作。

在这里插入图片描述

Shark的设计导致了两个问题
一、是执行计划优化完全依赖于Hive,不方便添加新的优化策略。

二、是因为Spark是线程级并行,而MapReduce是进程级并行,因此,Spark在兼容Hive的实现上存在线程安全问题,导致Shark不得不使用另外一套独立维护的打了补丁的Hive源码分支。

3、Spark SQL架构如下:

在这里插入图片描述

Spark SQL在Hive兼容层面仅依赖HiveQL解析、Hive元数据,也就是说,从HQL被解析成抽象语法树(AST)起,就全部由Spark SQL接管了。Spark SQL执行计划生成和优化都由Catalyst(函数式关系查询优化框架)负责。

Spark SQL增加了DataFrame(即带有Schema信息的RDD),使用户可以在Spark SQL中执行SQL语句,数据既可以来自RDD,也可以是Hive、HDFS、Cassandra等外部数据源,还可以是JSON格式的数据。
Spark SQL目前支持Scala、Java、Python三种语言,支持SQL-92规范。

二、DataFrame概述

1、DataFrame的推出,让Spark具备了处理大规模结构化数据的能力,不仅比原有的RDD转化方式更加简单易用,而且获得了更高的计算性能。
Spark能够轻松实现从MySQL到DataFrame的转化,并且支持SQL查询。

RDD是分布式的 Java对象的集合,但是,对象内部结构对于RDD而言却是不可知的。
DataFrame是一种以RDD为基础的分布式数据集,提供了详细的结构信息。
在这里插入图片描述
从Spark2.0以上版本开始,Spark使用全新的SparkSession接口替代Spark1.6中的SQLContext及HiveContext接口来实现其对数据加载、转换、处理等功能。SparkSession实现了SQLContext及HiveContext所有功能。

SparkSession支持从不同的数据源加载数据,并把数据转换DataFrame,并且支持把DataFrame转换成SQLContext自身中的表,然后使用SQL语句来操作数据。SparkSession亦提供了HiveQL以及其他依赖于Hive的功能的支持。

在编写独立应用程序时,可以通过如下语句创建一个SparkSession对象

from pyspark import SparkContext,SparkConf
from pyspark.sql import SparkSession
spark = SparkSession.builder.config(conf = SparkConf()).getOrCreate()

实际上,在启动进入pyspark以后,pyspark就默认提供了一个SparkContext对象(名称为sc)和一个SparkSession对象(名称为spark)

在这里插入图片描述

2、从不同类型的文件中加载数据创建DataFrame

#从不同类型的文件中加载数据创建DataFrame
df1 = spark.read.text("file:///home/hadoop/program1/people.txt")
df1.show()
df2 = spark.read.json("file:///home/hadoop/program1/people.json")
df2.show()
df1_1 = spark.read.format("text").load("file:///home/hadoop/program1/people.txt")
df1_1.show()
df2_1 = spark.read.format("json").load("file:///home/hadoop/program1/people.json")
df2_1.show()

结果:

在这里插入图片描述
3、DataFrame的保存

#DataFrame的保存
#例:把上面名称为df1的文件保存到不同格式文件中
df1.write.text("df1.txt")
df1.write.json("df1.json")
df1.write.format("text").save("df1.txt")
df1.write.format("json").save("df1.json")
df2.select("name","age").write.format("json").save("file:///home/hadoop/program1/df2.json") #选取指定的列保存

另一种存储方式Parquet。详细见下面链接。

很详细的Parquet存储讲解

当把该数据保存到一个文本文件中会新生成一个名称为df1.json的目录(不是文件)和一个名称df1.txt的目录(不是文件)

如果再次读取json或text文件生成DataFrame,可以直接用这个目录名称,不需要使用part-00000-093d3250-a36a-4ca4-affc-5144b2a2759a-c000.txt文件(当然,使用这个文件也可以)。
在这里插入图片描述

三、DataFrame的常用操作
  • printSchema()

打印出DataFrame的模式(Schema)信息。

在这里插入图片描述

  • select()

从DataFrame中选取部分列的数据。

在这里插入图片描述

  • filter()

实现条件查询,找到满足条件要求的记录。

在这里插入图片描述

  • groupBy()

用于对记录进行分组。

在这里插入图片描述

  • sort()

用于对记录进行排序。

在这里插入图片描述

四、从RDD转换得到DataFrame

Spark提供了如下两种方法实现从RDD转换得到DataFrame

1.利用反射机制推断RDD模式

利用反射机制来推断包含特定类型对象的RDD的模式(Schema),适用于数据结构已知时的RDD转换。

例:现在要把people.txt加载到内存中生成一个DataFrame,并查询其中的数据:

from pyspark.sql import Row
people = sc.textFile("file:///home/hadoop/program1/people.txt")      #生成RDD文件
people1 = people.map(lambda x:x.split(" ")).map(lambda x:Row(name=x[0],age=x[1]))   #得到新的RDD,每个元素都是Row对象
schemaPeople = spark.createDataFrame(people1)         #转换成DataFrame
schemaPeople.createOrReplaceTempView("people")      #注册为临时表,临时表名字为people
personsDF = spark.sql("select name,age from people where age>20")  #SQL语句查询
personsRDD = personsDF.rdd.map(lambda x:"Name: "+x.name+","+"Age "+x.age)   #格式化输出
personsRDD.collect()

结果:

['Name: Michael,Age 40', 'Name: Andy,Age 30']

2.使用编程方式定义RDD模式

使用编程接口构造一个模式(Schema),并将其应用在已知的RDD上,适用于数据结构未知时的RDD转换。

在这里插入图片描述

from pyspark.sql.types import *
from pyspark.sql import Row
#下面生成“表头”
schemaString = "name age"
fields = [StructField(field_name, StringType(), True) for field_name in schemaString.split(" ")]
schema = StructType(fields)
#下面生成“表中的记录”
lines = sc.textFile("file:///home/hadoop/program1/people.txt")
parts = lines.map(lambda x: x.split(" "))
people = parts.map(lambda x: Row(x[0], x[1].strip()))
#下面把“表头”和“表中的记录”拼装在一起
schemaPeople = spark.createDataFrame(people, schema)
schemaPeople.createOrReplaceTempView("people")
results = spark.sql("select name,age from people")
results.show()

结果

+-------+---+
|   name|age|
+-------+---+
|Michael| 40|
|   Andy| 30|
| Justin| 19|
+-------+---+
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_46917254/article/details/123959257

智能推荐

如何在基于wamp环境的PhpStorm导入项目并成功运行(本地服务器)【全程图片教程】_phpstorm2024怎么导入setting-程序员宅基地

文章浏览阅读3.5k次,点赞7次,收藏37次。在wamp、PhpStorm成功安装后如何导入已有的PHP项目文件并运行。据作者近日查阅资料发现,网络上关于phpstorm导入项目方面教程甚少且相对零散,故作此教程。过程由作者综合网络上教程得来,某些地方不知原理,只知如何操作。如有知道原理的朋友欢迎提出~教程内容如有错误或不准确欢迎指正。第一步,配置.PHP运行环境先将项目中的代码文件、资源文件放到一个目录下,这里我是把它们放到了..._phpstorm2024怎么导入setting

机器学习中的数学_机器学习为什么是数学模型-程序员宅基地

文章浏览阅读1.6k次。本文由LeftNotEasy所有,发布于http://leftnoteasy.cnblogs.com。如果转载,请注明出处,在未经作者同意下将本文用于商业用途,将追究其法律责任。(1)-回归(regression)、梯度下降(gradient descent)前言: 上次写过一篇关于贝叶斯概率论的数学,最近时间比较紧,coding的任务比较重,不过还是抽空看了一_机器学习为什么是数学模型

大数据学习之Flink、Flink容错机制的注意事项-程序员宅基地

文章浏览阅读531次,点赞7次,收藏8次。在实际应用中,需要注意一些问题,如避免在Checkpoint期间发生故障、确保Checkpoint和Savepoint的一致性、处理失败的Checkpoint或Savepoint等。

挖洞技巧:支付漏洞之总结_支付功能点的漏洞有哪些-程序员宅基地

文章浏览阅读727次。文章目录前言0x01 修改支付价格0x02 修改支付状态0x03 修改购买数量0x04 修改附属值0x05 修改支付接口0x06 多重替换支付0x07 重复支付0x08 最小额支付0x09 值为最大值支付问题0x10 越权支付0x11 无限制试用0x12 修改优惠价前言支付漏洞一直以来就是高风险,对企业来说危害很大,对用户来说同样危害也大。就比如我用他人账户进行消费,这也属于支付漏洞中的越权问题。那么支付漏洞一般存在在哪些方面呢,根据名字就知道,凡是涉及购买、资金等方面的功能处就_支付功能点的漏洞有哪些

知乎|10个程序员必备免费电子书下载网站_电子书 知乎-程序员宅基地

文章浏览阅读2.4w次,点赞12次,收藏126次。作为开发者,多多少少都会看些技术书籍,许多经典的技术书籍作者都是国外的,等到中文翻译版出来很多书籍可能已经不适用了,购买原版书籍,价格又太高,因此知道一些免费的图书下载网站是非常重要的,下面就和大家分享一下免费的电子书下载网站1、谷歌图书搜索相信没有人不知道谷歌图书,这个网站有很多免费的电子书籍,而且各种格式都有,当然你也可以在上面购买,如果你想下载免费的电子书,首先尝试谷歌图书搜索,一般不会..._电子书 知乎

随便推点

.Net5使用Sqlsugar操作加密Sqlite数据库_sqlsugar怎么给sqlite数据库加密-程序员宅基地

文章浏览阅读2.3k次。Nuget 安装以下程序包1.SqlSugarCore2.Microsoft.Data.Sqlite.Core3.SQLitePCLRaw.bundle_e_sqlcipherusing Microsoft.Data.Sqlite;using Microsoft.VisualStudio.TestTools.UnitTesting;using SqlSugar;using System;using System.Collections.Generic;using System_sqlsugar怎么给sqlite数据库加密

Web应用开发基础-程序员宅基地

文章浏览阅读906次,点赞20次,收藏21次。对于web前端学习小白来说,html+css基础尤为重要,可以说是编程小白的必经之路,学完后能写出你看到的静态页面。1)PC端网站布局包含知识点: HTML基础,CSS基础,CSS核心属性;CSS样式层叠,继承,盒模型;容器,溢出及元素类型;浏览器兼容与宽高自适应……2)HTML5+CSS3基础包含知识点: HTML5新增的元素与属性;表单域增强元素;CSS3选择器;文字字体相关样式;CSS3位移与变形处理……3)WebApp页面布局包含知识点: 移动端页面设计规范;移动端切图;_web应用开发基础

模拟实现std::string类(包含完整、分文件程序)-程序员宅基地

文章浏览阅读626次,点赞15次,收藏14次。std库中的string是一个类,对string的模拟实现,既可以复习类的特性,也可以加深对std::string的理解。

数学-洛必达法则_洛必达法则0/0求导-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏3次。洛必达法则是在一定条件下通过分子分母分别求导再求极限来确定未定式值的方法[1]。众所周知,两个无穷小之比或两个无穷大之比的极限可能存在,也可能不存在。因此,求这类极限时往往需要适当的变形,转化成可利用极限运算法则或重要极限的形式进行计算。洛必达法则便是应用于这类极限计算的通用方法零比零型若函数和满足下列条件:⑴,;⑵ 在点的某去心邻域内两者都可导,且;..._洛必达法则0/0求导

[转]Java中主线程如何捕获子线程抛出的异常_java 主线程捕获子线程异常-程序员宅基地

文章浏览阅读7.6k次。这么来看待这个问题。首先明确线程代码的边界。其实很简单,Runnable接口的run方法所界定的边界就可以看作是线程代码的边界。Runnable接口中run方法原型如下: << public void run(); >> 而所有的具体线程都实现这个方法,所以这里就明确了一点,线程代码不能抛出任何checked异常。所有的线程中的checked异常都只能被线程本身消化掉。:) 这样本身也是符_java 主线程捕获子线程异常

使用polar()绘制雷达图-程序员宅基地

文章浏览阅读346次,点赞8次,收藏6次。该函数常用参数的含义如下。

推荐文章

热门文章

相关标签