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格式的数据

spark write mode 会删除所有数据吗 spark.read.schema_hive

spark write mode 会删除所有数据吗 spark.read.schema_Hive_02

spark write mode 会删除所有数据吗 spark.read.schema_hive_03

spark write mode 会删除所有数据吗 spark.read.schema_Hive_04

spark write mode 会删除所有数据吗 spark.read.schema_大数据_05


spark write mode 会删除所有数据吗 spark.read.schema_hive_06


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

spark write mode 会删除所有数据吗 spark.read.schema_大数据_07

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 编程中,某个值使用多次,考虑变量代替)

spark write mode 会删除所有数据吗 spark.read.schema_Hive_08

spark write mode 会删除所有数据吗 spark.read.schema_大数据_09

spark write mode 会删除所有数据吗 spark.read.schema_大数据_10

使用方法和hive完全一致

spark write mode 会删除所有数据吗 spark.read.schema_大数据_11

spark write mode 会删除所有数据吗 spark.read.schema_SQL_12

spark write mode 会删除所有数据吗 spark.read.schema_hive_13

spark write mode 会删除所有数据吗 spark.read.schema_hive_14

spark write mode 会删除所有数据吗 spark.read.schema_Hive_15

spark write mode 会删除所有数据吗 spark.read.schema_SQL_16

spark write mode 会删除所有数据吗 spark.read.schema_Hive_17

spark write mode 会删除所有数据吗 spark.read.schema_hive_18

spark write mode 会删除所有数据吗 spark.read.schema_大数据_19

  -b. Thrift JDBC/ODBC server

Thrift JDBC/ODBC server在这的实现与HiveServer2完全一致,你可以测试JDBC通过beeline的命
令行来连接它

spark write mode 会删除所有数据吗 spark.read.schema_Hive_20

spark write mode 会删除所有数据吗 spark.read.schema_SQL_21

 翻译:为了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]

spark write mode 会删除所有数据吗 spark.read.schema_SQL_22

 -a. 启动Client:beeline 方式

与Hive中完全一致
 bin/beeline
 beeline>!connect jdbc:hive2://bigdata-training01.erongda.com:10000

spark write mode 会删除所有数据吗 spark.read.schema_Hive_23

连接成功后监控页面

spark write mode 会删除所有数据吗 spark.read.schema_hive_24

spark write mode 会删除所有数据吗 spark.read.schema_SQL_25

 

spark write mode 会删除所有数据吗 spark.read.schema_Hive_26

 连接另一个账户( 通过服务方式连接可以有大数量的用户)

spark write mode 会删除所有数据吗 spark.read.schema_hive_27

spark write mode 会删除所有数据吗 spark.read.schema_Hive_28

 缓存表

spark write mode 会删除所有数据吗 spark.read.schema_大数据_29

 比对缓存前后查询表的速度

spark write mode 会删除所有数据吗 spark.read.schema_SQL_30

如何资源共享:
1、	创建一个服务后有很多用户
2、	一个用户缓存了一张表,其他用户都能快速读取

spark write mode 会删除所有数据吗 spark.read.schema_大数据_31

spark write mode 会删除所有数据吗 spark.read.schema_Hive_32

 -b. 启动Client:JDBC 方式

与Hive JDBC完全一致

https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-JDBC