一、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相关推荐

  1. PySpark | SparkSQL入门 | DataFrame入门

    文章目录 一.快速入门 1. 什么是SparkSQL 2. 为什么要学习SparkSQL 3. SparkSQL特点 二.SparkSQL概述 1. SparkSQL和Hive的异同 2. Spark ...

  2. SparkSQL之DataFrame案例

    待处理文件 准备待处理文件student.data,内容如下: 1|vincent|13827460000|gvark@eyou.com 2|jenny|13827460002|ovwgofpa@56 ...

  3. SparkSql之DataFrame操作

    Spark SQL中的DataFrame类似于一张关系型数据表.在关系型数据库中对单表或进行的查询操作,在DataFrame中都可以通过调用其API接口来实现.可以参考,Scala提供的DataFra ...

  4. SparkSQL 创建 DataFrame 的方式

    1.读取 json 格式的文件创建 DataFrame 注意: 可以两种方式读取 json 格式的文件. df.show()默认显示前 20 行数据. DataFrame 原生 API 可以操作 Da ...

  5. SparkSQL之DataFrame 编程(创建DataFrame ,DataFrame数据运算操作 ,输出存储DataFrame)(11)

    一  新的编程入口 SparkSession SparkSession 是 Spark 最新的 SQL 查询起始点 ,实质上是 SQLcontext 和 SparkContext 的组合 ,所以在 S ...

  6. SparkSQL之DataFrame API

    测试文件 测试文件employees.json,内容如下: {"name":"Michael", "salary":3000, " ...

  7. sparksql:dataframe数据写入到Hbase中

    一.步骤:在idea中编程 1.1 添加依赖 <?xml version="1.0" encoding="UTF-8"?> <project ...

  8. PySpark︱DataFrame操作指南:增/删/改/查/合并/统计与数据处理

    笔者最近需要使用pyspark进行数据整理,于是乎给自己整理一份使用指南.pyspark.dataframe跟pandas的差别还是挺大的. 文章目录 1.-------- 查 -------- -- ...

  9. Pyspark 读 DataFrame 的使用与基本操作

    一.安装 基于 mac 操作系统 安装 jdk jdk 下载地址 安装 pyspark pip install pyspark 二.读取 HDFS 文件 读 json 注意,如果是多行的 json,需 ...

最新文章

  1. hive load data inpath 空目录_走近大数据之Hive进阶(一、Hive数据的导入)
  2. SQLiteOpenHelper简介
  3. 在张学友演唱会的6万观众中,AI锁定了一名逃犯
  4. oracle数据库通过SQL profile 绑定SQL最优执行计划(个人实践)
  5. EIGRP路由协议的简单理解及应用
  6. 阿里巴巴架构师,讲透2亿用户的钉钉系统架构实践
  7. 基于单片机的老人防摔GSM报警
  8. JS搜索省份匹配出省份的所有城市
  9. win10升级补丁_官方win10教育版怎么样
  10. Mac谷歌浏览器添加JSONView的插件以提高开发的效率
  11. 年薪90万的阿里p7和副处级干部选哪个?
  12. bzoj 4987 Tree
  13. VMwarenbsp;vSpherenbsp;ESXiamp;nb…
  14. 找不到网络路径计算机共享,win10 局域网共享问题 提示0x80070035 找不到网络路径...
  15. Clickhouse备份恢复方式概览
  16. React源码分析(二)= Reac初次渲染分析
  17. SQL手工注入漏洞测试(Oracle数据库)
  18. 一个月体验,终于懂了程序员为什么喜欢用MacBook!
  19. 百度地图4 从0开始
  20. matlab里如何输入圆周,用MATLAB实现序列的圆周卷积

热门文章

  1. 街篮服务器维护比赛没打完,一球成名!热血街篮追梦杯圆满落幕,WaRn丶警告战队一穿五夺冠...
  2. 一个屌丝程序猿的人生(八十二)
  3. 最新开源版知音QQ助手V1.0.16版本
  4. Android中创建一个商品展示小案例
  5. checkbox 选中触发js事件
  6. 堆溢出(DwordShoot)利用SEH异常处理
  7. 读《筚路蓝缕——世纪工程决策建设记述》II
  8. Oracle数据库之子程序和包(八)
  9. MYSQL数据库的基本操作八(存储函数)
  10. CCF 201712-4行车路线