35、sparkSQL及DataFrame
一、saprkSQL背景
Spark 1.0版本开始,推出了Spark SQL。其实最早使用的,都是Hadoop自己的Hive查询引擎;但是后来Spark提供了Shark;再后来Shark被淘汰,推出了Spark SQL。Shark的性能比Hive就要高出一个数量级, 而Spark SQL的性能又比Shark高出一个数量级。最早来说,Hive的诞生,主要是因为要让那些不熟悉Java,无法深入进行MapReduce编程的数据分析师,能够使用他们熟悉的关系型数据库的SQL模型,来操作HDFS上的数据。因此推出了Hive。H ive底层基于MapReduce实现SQL功能,能够让数据分析人员,以及数据开发人员,方便的使用Hive进行数据仓库的建模和建设,然后使用SQL模型针对数据仓库中的数据进行统计和分析。但是Hive 有个致命的缺陷,就是它的底层基于MapReduce,而MapReduce的shuffle又是基于磁盘的,因此导致Hive的性能异常低下。进场出现复杂的SQL ETL,要运行数个小时,甚至数十个小时的情况。后来,Spark推出了Shark,Shark与Hive实际上还是紧密关联的,Shark底层很多东西还是依赖于Hive,但是修改了内存管理、物理计划、执行三个模块,底层使用Spark的基于内存的计算模型, 从而让性能比Hive提升了数倍到上百倍。然而,Shark还是它的问题所在,Shark底层依赖了Hive的语法解析器、查询优化器等组件,因此对于其性能的提升还是造成了制约。所以后来Spark团队决定,完全抛弃Shark, 推出了全新的Spark SQL项目。Spark SQL就不只是针对Hive中的数据了,而且可以支持其他很多数据源的查询。Spark SQL的特点 1、支持多种数据源:Hive、RDD、Parquet、JSON、JDBC等。 2、多种性能优化技术:in-memory columnar storage、byte-code generation、cost model动态评估等。 3、组件扩展性:对于SQL的语法解析器、分析器以及优化器,用户都可以自己重新开发,并且动态扩展。在2014年6月1日的时候,Spark宣布了不再开发Shark,全面转向Spark SQL的开发。Spark SQL的性能比Shark来说,又有了数倍的提升。Spark SQL的性能优化技术简介1、内存列存储(in-memory columnar storage)内存列存储意味着,Spark SQL的数据,不是使用Java对象的方式来进行存储,而是使用面向列的内存存储的方式来进行存储。也就是说,每一列,作为一个数据存储的单位。从而大大优化了内存使用的效率。采用了内存列存储之后,减少了对内存的消耗,也就避免了gc大量数据的性能开销。2、字节码生成技术(byte-code generation)Spark SQL在其catalyst模块的expressions中增加了codegen模块,对于SQL语句中的计算表达式,比如select num + num from t这种的sql,就可以使用动态字节码生成技术来优化其性能。3、Scala代码编写的优化对于Scala代码编写中,可能会造成较大性能开销的地方,自己重写,使用更加复杂的方式,来获取更好的性能。比如Option样例类、for循环、map/filter/foreach等高阶函数,以及不可变对象,都改成了用null、while循环等来实现,并且重用可变的对象。
二、DataFrame
1、DataFrame介绍
Spark SQL是Spark中的一个模块,主要用于进行结构化数据的处理。它提供的最核心的编程抽象,就是DataFrame。同时Spark SQL还可以作为分布式的SQL查询引擎。 Spark SQL最重要的功能之一,就是从Hive中查询数据。DataFrame,可以理解为是,以列的形式组织的,分布式的数据集合。它其实和关系型数据库中的表非常类似,但是底层做了很多的优化。DataFrame可以通过很多来源进行构建, 包括:结构化的数据文件,Hive中的表,外部的关系型数据库,以及RDD。
2、SQLContext
要使用Spark SQL,首先就得创建一个创建一个SQLContext对象(入口),或者是它的子类的对象,比如HiveContext的对象。Java版本: JavaSparkContext sc = ...; SQLContext sqlContext = new SQLContext(sc);Scala版本: val sc: SparkContext = ... val sqlContext = new SQLContext(sc) import sqlContext.implicits._
3、HiveContext
除了基本的SQLContext以外,还可以使用它的子类——HiveContext。HiveContext的功能除了包含SQLContext提供的所有功能之外,还包括了额外的专门针对Hive的一些功能。 这些额外功能包括:使用HiveQL语法来编写和执行SQL,使用Hive中的UDF函数,从Hive表中读取数据。要使用HiveContext,就必须预先安装好Hive,SQLContext支持的数据源,HiveContext也同样支持——而不只是支持Hive。对于Spark 1.3.x以上的版本,都推荐使用HiveContext, 因为其功能更加丰富和完善。Spark SQL还支持用spark.sql.dialect参数设置SQL的方言。使用SQLContext的setConf()即可进行设置。对于SQLContext,它只支持“sql”一种方言。对于HiveContext, 它默认的方言是“hiveql”。
4、创建DataFrame
使用SQLContext,可以从RDD、Hive表或者其他数据源,来创建一个DataFrame。以下是一个使用JSON文件创建DataFrame的例子:-------java版-------package cn.spark.study.sql;import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.sql.DataFrame; import org.apache.spark.sql.SQLContext;public class DataFrameCreate {public static void main(String[] args) {SparkConf conf = new SparkConf().setAppName("DataFrameCreate");JavaSparkContext sc = new JavaSparkContext(conf);SQLContext sqlContext = new SQLContext(sc);DataFrame df = sqlContext.read().json("hdfs://spark1:9000/students.json");df.show();} }##student.txt [root@spark1 sql]# cat students.json {"id":1, "name":"leo", "age":18} {"id":2, "name":"jack", "age":19} {"id":3, "name":"marry", "age":17}##将student.txt上传到hdfs##打maven包,并上传到集群;#运行脚本 [root@spark1 sql]# cat dataframe_create.sh /usr/local/spark-1.5.1-bin-hadoop2.4/bin/spark-submit \ --class cn.spark.study.sql.DataFrameCreate \ --num-executors 3 \ --driver-memory 100m \ --executor-memory 100m \ --executor-cores 3 \ --files /usr/local/hive/conf/hive-site.xml \ --driver-class-path /usr/local/hive/lib/mysql-connector-java-5.1.17.jar \ /usr/local/spark-study/java/sql/saprk-study-java-0.0.1-SNAPSHOT-jar-with-dependencies.jar \#结果 +---+---+-----+ |age| id| name| +---+---+-----+ | 18| 1| leo| | 19| 2| jack| | 17| 3|marry| +---+---+-----+
-------scala版-------
package cn.spark.study.sqlimport org.apache.spark.SparkConf import org.apache.spark.SparkContext import org.apache.spark.sql.SQLContextobject DataFrameCreate {def main(args: Array[String]) {val conf = new SparkConf().setAppName("DataFrameCreate")val sc = new SparkContext(conf)val sqlContext = new SQLContext(sc)val df = sqlContext.read.json("hdfs://spark1:9000/students.json")df.show()} }#Export-->打jar包-->上传到服务器#运行脚本 [root@spark1 sql]# cat dataframe_create.sh /usr/local/spark-1.5.1-bin-hadoop2.4/bin/spark-submit \ --class cn.spark.study.sql.DataFrameCreate \ --num-executors 3 \ --driver-memory 100m \ --executor-memory 100m \ --executor-cores 3 \ --files /usr/local/hive/conf/hive-site.xml \ --driver-class-path /usr/local/hive/lib/mysql-connector-java-5.1.17.jar \ /usr/local/spark-study/scala/sql/spark-study-scala.jar \#结果+---+---+-----+ |age| id| name| +---+---+-----+ | 18| 1| leo| | 19| 2| jack| | 17| 3|marry| +---+---+-----+
5、DataFrame的常用操作
Java版本 ##创建出来的DataFrame完全可以理解为一张表 DataFrame df = sqlContext.read().json("hdfs://spark1:9000/students.json");##打印DataFram中所有的数据 df.show();##打印DataFram中的元数据(schema) df.printSchema();##查询某一列所有的数据 df.select("name").show();##查询某几列所有的数据,并对列进行计算 df.select(df.col("name"), df.col("age").plus(1)).show();##根据某一列的值进行过滤 df.filter(df.col("age").gt(21)).show();##根据某一列进行分组,然后进行聚合 df.groupBy("age").count().show();Scala版本 val df = sqlContext.read.json("hdfs://spark1:9000/students.json")df.show() df.printSchema() df.select("name").show() df.select(df("name"), df("age") + 1).show() df.filter(df("age") > 21).show() df.groupBy("age").count().show()
转载于:https://www.cnblogs.com/weiyiming007/p/11268491.html
35、sparkSQL及DataFrame相关推荐
- PySpark | SparkSQL入门 | DataFrame入门
文章目录 一.快速入门 1. 什么是SparkSQL 2. 为什么要学习SparkSQL 3. SparkSQL特点 二.SparkSQL概述 1. SparkSQL和Hive的异同 2. Spark ...
- SparkSQL之DataFrame案例
待处理文件 准备待处理文件student.data,内容如下: 1|vincent|13827460000|gvark@eyou.com 2|jenny|13827460002|ovwgofpa@56 ...
- SparkSql之DataFrame操作
Spark SQL中的DataFrame类似于一张关系型数据表.在关系型数据库中对单表或进行的查询操作,在DataFrame中都可以通过调用其API接口来实现.可以参考,Scala提供的DataFra ...
- SparkSQL 创建 DataFrame 的方式
1.读取 json 格式的文件创建 DataFrame 注意: 可以两种方式读取 json 格式的文件. df.show()默认显示前 20 行数据. DataFrame 原生 API 可以操作 Da ...
- SparkSQL之DataFrame 编程(创建DataFrame ,DataFrame数据运算操作 ,输出存储DataFrame)(11)
一 新的编程入口 SparkSession SparkSession 是 Spark 最新的 SQL 查询起始点 ,实质上是 SQLcontext 和 SparkContext 的组合 ,所以在 S ...
- SparkSQL之DataFrame API
测试文件 测试文件employees.json,内容如下: {"name":"Michael", "salary":3000, " ...
- sparksql:dataframe数据写入到Hbase中
一.步骤:在idea中编程 1.1 添加依赖 <?xml version="1.0" encoding="UTF-8"?> <project ...
- PySpark︱DataFrame操作指南:增/删/改/查/合并/统计与数据处理
笔者最近需要使用pyspark进行数据整理,于是乎给自己整理一份使用指南.pyspark.dataframe跟pandas的差别还是挺大的. 文章目录 1.-------- 查 -------- -- ...
- Pyspark 读 DataFrame 的使用与基本操作
一.安装 基于 mac 操作系统 安装 jdk jdk 下载地址 安装 pyspark pip install pyspark 二.读取 HDFS 文件 读 json 注意,如果是多行的 json,需 ...
最新文章
- hive load data inpath 空目录_走近大数据之Hive进阶(一、Hive数据的导入)
- SQLiteOpenHelper简介
- 在张学友演唱会的6万观众中,AI锁定了一名逃犯
- oracle数据库通过SQL profile 绑定SQL最优执行计划(个人实践)
- EIGRP路由协议的简单理解及应用
- 阿里巴巴架构师,讲透2亿用户的钉钉系统架构实践
- 基于单片机的老人防摔GSM报警
- JS搜索省份匹配出省份的所有城市
- win10升级补丁_官方win10教育版怎么样
- Mac谷歌浏览器添加JSONView的插件以提高开发的效率
- 年薪90万的阿里p7和副处级干部选哪个?
- bzoj 4987 Tree
- VMwarenbsp;vSpherenbsp;ESXiamp;nb…
- 找不到网络路径计算机共享,win10 局域网共享问题 提示0x80070035 找不到网络路径...
- Clickhouse备份恢复方式概览
- React源码分析(二)= Reac初次渲染分析
- SQL手工注入漏洞测试(Oracle数据库)
- 一个月体验,终于懂了程序员为什么喜欢用MacBook!
- 百度地图4 从0开始
- matlab里如何输入圆周,用MATLAB实现序列的圆周卷积