Spark SQL是Spark 框架中一个重要模块
SparkSQL: 结构化(Schema)数据处理分析框架
Spark SQL is Apache Spark's module for working with structured data.
http:///sql/
1. 如何读取数据
Spark2.x使用SparkSession读取数据
SparkSession: spark -> 实例对象名称
spark.read -> 返回值DataFrameReader
.textFile/text/json/parquet/orc/csv/tsv ->内部支持
.jdbc(mysql/oracle/mssql/db2) -> 内部支持
.hbase/hive -> hive内部支持 ,但是hbase不支持
.redis/mongoDB
.ex
.xx
外部支持数据源:
https://spark-packages.org/
备注:
Spark 1.x 中使用SQLContext:sqlContext
sqlContext.read
.textFile/text/json/parquet/orc/csv/tsv ->内部支持
.jdbc(mysql/oracle/mssql/db2) -> 内部支持
.hbase/hive -> hive内部支持
.redis/mongoDB
.ex
.xx
2. 读取的数据封装到Dataset/DataFream中
Dataset/DataFrame
RDD + Schema(字段名称和字段类型)
类似于一张RDBMS表
schema/printSchema()
3. 分析数据
-a. SQL
- 如果从Hive表中读取数据
val resultDF = spark.sql("...")
// Spark 1.x: hiveContext.sql("...")
- 如果从其他存储系统读取数据
-i. 将Dataset/DataFrame注册为临时视图
inputDF/inpuDS.createOrReplaceTempView("view_tmp_...")
-ii. 使用SQL分析
spark.sql("....")
-b. DSL编程
Domain-Special Language
Dataset/DataFrame API调用,链式编程(RDD编程类似)
DataFrame = Datset[Row]
Row 一行数据,可类比Array,里面存储数据
4. 存储结果数据
SparkSQL能从哪里读取数据就能往哪里写入数据
dataset/dataframe.write
.mode(SavaMode.Appen) // 默认值 存在即报错
.xx
5.读取json格式的数据
3、SparkSQL从hive中读取数据
将Mysql驱动和hive.site.xml拷贝到了Spark中,这个时候需要将Spark集群进行重启,重启完成
之后,需要启动Spark的thriftserver服务
启动这个服务主要是通过这个服务进行监听JDBC的相关操作,默认端口为10000
$ ./spark-2.4.0/sbin/
启动完成之后可以通过Spark中自带的beeline服务来进行JDBC连接,连接到SparkSql
$ ./spark-2.4.0/bin/beeline
beeline > !connect jdbc:hive2://master1:10000/default
Enty Username : hadoop
Enty password : (空)
如上内容说明配置成功,在这里面能够查询出刚才通过hive终端创建的表和数据,同样的可以进行相
关查询创建操作
beelin可以使用hive中的也可以使用spark中带的都可以
经过上面的测试说明jdbc也是能够进行访问SparkSql中的数据的,并且根据打印日志看出来所有的查
询或者是创建操作是基于Spark而不是MapReduce
SparkSQL:
SparkSQL从Hive框架发展而来,比Hive功能要强很多,以至于Hive 2.x版本建议底层数据处理
引擎使用Spark而不是MapReduce
回顾一下:
在Hive框架中如何分析数据的呢?
- 开发测试-方式一:
bin/hive - 交互式命令行
- 开发测试-方式二: - CDH版本的Hive推荐使用此种方式
HiveServer2服务 - MySQL数据库服务
- beeline
提交SQL命令行
- JDBC
编写类似Java JDBC代码,读取分析Hive表中的数据
- 实际测试与生产环境运行
- 指定SQL语句(shell脚本)
bin/hive -e "SELECT .... FROM ...."
- 执行SQL文件
bin/hive -f xxx.sql
SparkSQL既可以充当JDBC/ODBC分布式查询的引擎也能做命令行的接口,在这种模式下,从用户到用户
、用户到应用交互的运行. SparkSQL直接运行SQL查询,而不需要写任何代码.
-a. 提供SQL分析
Distributed SQL Engine
$ bin/spark-sql [options] [cli option]
注意:
1、bin/hive 的用法完全一致(hive中能做的spark-sql都能做)
2、如果将以前使用Hive开发的SQL分析,升级到使用SparkSQL开发,对于SQL语句来说,不需
要改动太大,仅仅替换运行的命令即可(Shell 编程中,某个值使用多次,考虑变量代替)
使用方法和hive完全一致
-b. Thrift JDBC/ODBC server
Thrift JDBC/ODBC server在这的实现与HiveServer2完全一致,你可以测试JDBC通过beeline的命
令行来连接它
翻译:为了Spark SQL与hive的集成、包括使用JDBC服务和命令行,编译时候需要加上-phive、-phive-thrifster这两个属性。默认的Spark是基于Hive 1.2.1构建的
对比a方式的好处:
1、 如果在大数据集群上,a方式被上万个客户端调用,这样资源就不够用了;
2、 b方式就是当做一个服务,资源调配大一点,这样大量的客户端都可以来访问它可以避免a方式的
问题。
就是来自于 Hive框架中HiveServer2服务
对于SparkSQL框架来说,启动ThriftServer服务就是将Spark Application当做一个服务启动
,以供Client连接,此种方式在企业中使用较多。
启动服务:
sbin/start-thriftserver [options] [thrift server options]
具体启动服务,运行在本地模式,伴随两个线程
$演示一下,所以做最简单的本地模式
sbin/ \
--hiveconf hive.server2.thrift.port=10000 \ --端口号
--hiveconf hive.server2.thrift.bind.host=bigdata-training01.erongda.com \
--主机名
--master local[2]
-a. 启动Client:beeline 方式
与Hive中完全一致
bin/beeline
beeline>!connect jdbc:hive2://bigdata-training01.erongda.com:10000
连接成功后监控页面
连接另一个账户( 通过服务方式连接可以有大数量的用户)
缓存表
比对缓存前后查询表的速度
如何资源共享:
1、 创建一个服务后有很多用户
2、 一个用户缓存了一张表,其他用户都能快速读取
-b. 启动Client:JDBC 方式
与Hive JDBC完全一致
https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-JDBC