Spark SQL学习

Spark SQL学习

1.SparkSQL概述

Spark SQL学习
SparkSQL是能够操作结构化数据的spark中的module模块。

1.1.特点

1.1.1.Integrated(可集成的)

SparkSQL可以和Spark的程序混合在一起使用。
Spark SQL学习

1.1.2.Uniform Data Access(统一的数据访问方式)

Connect to any data source the same way.
DataFrames and SQL provide a common way to access a variety of data sources, including Hive, Avro, Parquet, ORC, JSON, and JDBC. You can even join data across these sources.
SparkSQL能够对各种各样的数据提供一个统一的数据访问方式。
Spark SQL学习

1.1.3.Hive Integration(可集成Hive)

Run SQL or HiveQL queries on existing warehouses.
Spark SQL supports the HiveQL syntax as well as Hive SerDes and UDFs, allowing you to access existing Hive warehouses.

1.1.4.Standard Connectivity(标准连接方式)

Connect through JDBC or ODBC.
A server mode provides industry standard JDBC and ODBC connectivity for business intelligence tools.
能够提供标准的jdbc和odbc作为客户端的连接方式,类似于mysql-server/hiveserver2.
一句话总结:
SparkSQL就是构建在SparkCore基础之上的能够使用SQL去操作结构化数据的Spark的module模块。

2.SparkSQL初体验

Spark-shell来体验sparksql

2.1.SparkSession

统一的编程入口

Spark SQL学习

2.2.基本体验操作

Spark SQL学习
Spark SQL学习

3.编程模型

SparkSQL的主要编程模型,就是SQL、DataFrame以及Dataset。
我们把RDD称为Spark的第一代编程模型,DataFrame称为第二代编程模型,Dataset称为第三代编程模型。

3.1.DataFrame

DataFrame相比较于RDD,就比RDD多了一行schema描述信息,这个schema可以理解为表头等元数据信息。
官方解释:
Spark SQL学习
一句话总结:DataFrame就是结构化数据库中的一张二维表。

3.2.Dataset

Dataset是RDD和DataFrame的集大成者,集成二者优点(RDD中的强类型推断,强大的lambda表达式和DataFrame中的执行引擎的优化的能力)
官方解释:
Spark SQL学习
一句话:Dataset=RDD+DataFrame
总结:相比 DataFrame,Dataset 提供了编译时类型检查,对于分布式程序来讲,提交一次作业太费劲了(要编译、打包、上传、运行),到提交到集群运行时才发现错误,影响开发进度,这也是引入 Dataset 的一个重要原因。

4.SparkSQL编程

4.1.加载依赖

<!-- sparksql-->
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-sql_2.11</artifactId>
  <version>${spark.version}</version>
</dependency>
<!--sparksql-hive-->
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-hive_2.11</artifactId>
  <version>${spark.version}</version>
</dependency>

4.2.程序入口——SparkSession

Spark2.x以前,sparkSQL的程序入口——SQLContext,如果要想操作Hive,就使用HiveContext,Spark2.x之后,SparkSQL的入口就统一切换到SparkSession中来了。
Spark SQL学习

4.3.DataFrame基本操作

Spark SQL学习

4.4.SQL基本操作

Spark SQL学习

5.RDD/list和DataFrame的转换

5.1.使用反射方式进行转化

5.1.1.List-2-dataframe

Spark SQL学习

5.1.2.Rdd-2-dataframe

Spark SQL学习

5.2.使用动态编程的方式进行转化

5.2.1.List-2-dataframe

Spark SQL学习

5.2.2.Rdd-2-dataframe

Spark SQL学习

5.3.Dataframe-2-rdd

Spark SQL学习

6.List/RDD和Dataset的转化

6.1.1.List-2-dataset

Spark SQL学习
修改正确之后:
Spark SQL学习

6.1.2.Rdd-2-dataset

Spark SQL学习

6.1.3.List/RDD-2-dataset

Spark SQL学习
但是必须要引入对应的spark的隐士转化
Spark SQL学习

6.1.4.其它转化

Spark SQL学习

7.SparkSQL数据源和落地方式

7.1.各种各样的数据源

使用默认的方式加载数据
Spark SQL学习
默认加载的文件格式为parquet===》
Spark SQL学习
读取指定格式的文件
Spark SQL学习

7.2.各种各样的落地方式

Spark SQL学习
===>jdbc
Spark SQL学习

8.SparkSQL和Hive的整合

/*
* SparkSQL和Hive的整合操作 
* 需求:
*     在hive数据库db-1808中有两张表
*         teacher_info
*             tname, height
*             zhangsan,175
*         teacher_basic
*             tname,age,married,children
*             zhangsan,23,false,0
*     需要完成的操作是:
*         1、使用sparksql创建数据db_1808
*         2、在db_1808中创建两张表teacher_info和teacher_basic,
*             并加载对应的数据
*         3、对这两张表进行关联查询,将最终结果存储到hive中的上述第一步创建的数据库中,表名为teacher
*          create table if not exists teacher as
*          select
*             b.tname,
*             b.age,
*             b.married,
*             b.children,
*             i.height
*          from teacher_info i
*          left join teacher_basic b on i.tname = b.tname;
*
*          insert <into|overwrite> table teacher
*          select
*             b.tname,
*             b.age,
*             b.married,
*             b.children,
*             i.height
*          from teacher_info i
*          left join teacher_basic b on i.tname = b.tname;
* /

第一步:构建Spark和Hive的整合,就需要在SparkSession中添加支持Hive.
Spark SQL学习
第二步:便可展开hive的操作,就想在hive终端执行操作一样。

// 1、使用sparksql创建数据db_1808
spark.sql("create database `db_1808`")
spark.sql("use `db_1808`")
// 2 在db_1808中创建两张表teacher_info和teacher_basic,并加载对应的数据
spark.sql(
    """
      |create table if not exists `db_1808`.`teacher_info` (
      |  tname string,
      |  height double
      |) row format delimited
      |fields terminated by ','
    """.stripMargin)
spark.sql("load data inpath 'hdfs://ns1/data/teacher_info.txt' into table `db_1808`.`teacher_info`")
spark.sql(
    """
      |create table if not exists `db_1808`.`teacher_basic` (
      |  tname string,
      |  age int,
      |  married boolean,
      |  children int
      |) row format delimited
      |fields terminated by ','
    """.stripMargin)
spark.sql("load data inpath 'hdfs://ns1/data/teacher_basic.txt' into table `db_1808`.`teacher_basic`")
//3 对这两张表进行关联查询,将最终结果存储到hive中的上述第一步创建的数据库中,表名为teacher
val sql =
    """
      |select
      |   b.tname,
      |   b.age,
      |   b.married,
      |   b.children,
      |   i.height
      |from teacher_info i
      |left join teacher_basic b on i.tname = b.tname
    """.stripMargin
val retDF = spark.sql(sql)
retDF.write.mode(SaveMode.Overwrite).saveAsTable("`db_1808`.`teacher`")

//最后在spark安装实例中添加hive的元数据信息:

1、将hive/conf目录下面的hive-site.xml配置文件拷贝到spark的conf目录下面
2、将mysql的依赖jar拷贝到spark的jars目录下面
Spark-submit.sh
Spark SQL学习