AmosCloud

Library

Have a Question?

If you have any question you can ask below or enter what you are looking for!

SparkSQL

SparkSQL

是什么

  • SparkSQL是Spark的一个模块,专门用于处理结构化数据(类似关系表)

  • 特点

    1. 兼容SparkCore
      SparkSQL允许在一个Spark程序中同时混合使用高级算子API和SQLAPI

    2. 统一的数据输入输出方式
      SparkSQL内置了各种常见数据源的输入输出方式
      可以使用如下语法,进行数据输入输出
      spark.read.format("fileFormat").load(path)
      df.write.format("fileFormat).save(path)

      • Spark默认支持的数据格式有:
      • 文本格式: JSON CSV TEXT
      • 列式存储文件: ORC Parquet
      • JDBC: MySQL Oracle...
    3. 完全兼容Hive
      SparkSQL基于Hive内核,提供了与Hive不同的新的数据抽象DataFrame和Dataset
      SparkSQL完全兼容Hive中的所有HQL语法和HQL的函数库,UDF
      SparkSQL完全支持Hive中的高性能数据结构的序列化和反序列化例如ORC

    4. 提供标准连接
      与hiveserver2类似的,SparkSQL也支持启动JDBC服务器,允许远程连接提交SQL
      与Hive不同的是,SparkSQL也支持ODBC

数据抽象对比

  • Spark1.0 提供了RDD

  • Spark1.3 提供了DataFrame (在1.6之后DataFrame使用Dataset[Row]代替)

  • Spark1.6 提供了Dataset

  • 相同点:
    RDD、DF、DS都是弹性分布式数据集

    1. 支持多个分区
    2. 支持依赖关系记录(血统)
    3. 支持自定义分区器,可以按照某些字段作为Key将数据散列到不同的分区
    4. 懒执行
      RDD的transformation不会真正启动job任务,而是仅仅编译时期记录RDD的依赖关系
      DF、DS 创建临时视图
      SparkSession.sql("xxx from df、ds") => df、ds
      DF、DS在编译SQL时与RDD类似,仅记录依赖关系,执行输出操作时,才真正提交job
  • 区别:

    • RDD
      使用算子api进行函数操作

    • DataFrame
      允许将数据映射为表结构,直接在DF执行SQL
      DF中相比较RDD除了保存数据内容,还使用schema保存了数据的字段名字段类型信息
      DF为了构建不同结构的表,内部使用Array[Any]保存每行的数据内容
      所以DF是一个弱类型的数据结构,会导致编译时期正常运行时期出现类型转换异常

    • Dataset
      具备RDD与DataFrame的所有功能
      并且将表结构使用案例类进行映射,保证了编译时期和运行时期的类型安全
      DS的弊端是,需要为每个表结构都创建一个实体类与之对应,不够灵活

SparkSQL与Hive的兼容

file

  • 如果使用SparkSQL处理原有的Hive数仓,可以做如下操作
    1. 将hive-site.xml文件拷贝到Spark的conf目录中
    2. 将mysql的java驱动jar包拷贝到Spark的jars目录中