Spark SQL

Spark SQL

Spark SQL 简介:

  • Spark用来处理结构化数据的模块。
    1. Hive On Spark : Hive负责存储元数据和SQL解析优化,使用Spark引擎,Spark负责采用RDD执行。
    2. Spark On Hive : Hive只负责存储元数据,Spark负责解析优化SQL,采用优化后的DataFrame和DataSet执行,更快。

DataFram、DataSet、RDD

  • DataFrame:是独立于RDD的分布式数据集,与RDD没有直接关系,且DataFrame带有Schema元信息。
  • DataSet :是强类型的分布式数据集,具有类型安全检查,DataFrame是DataSet的一个特例,‘type DataFrame = DataSet[Row]‘。
  • RDD(Spark1.0)=> Dataframe(Spark1.3)=> Dataset(Spark1.6)

共性:

  • 三者都采用惰性机制,只有碰到行动算子才会加载。
  • 三者都是Spark平台的弹性分布式数据集,为处理大型数据提供便利。
  • 三者都会根据内存的情况进行自动缓存,以及都拥有分区的概念。
    说明:SparkSQL性能比RDD高,因为SparkSQL了解数据内部结构,对藏于DataFrame背后的数据源以及作用于DataFrame之上的变换进行了针对性优化,而RDD 并不了解数据的内部结构,SparkCore只能在Stage层面进行简单通用的流水线优化。

SparkSession :

  • Spark新的SQL查询起点,是SQLContext和HiveContext,内部封装了SparkContext,计算实际上是由SparkContext完成的。使用SparkShell时,框架会自动给创建一个名为Spark的SparkSession。

DataFrame创建方式:

  1. 通过Spark的数据源进行创建。
  2. 从某个存在的RDD进行转换。
  3. 从Hive Table进行查询返回。

SQL风格语法:

  • 查询数据是通过SQL语句查询,必须要有临时视图或全局试图来辅助。

  • 临时视图:只针对当前会话有效,不支持跨会话。

  • 全局视图:全局有效,支持不同会话。
    说明:对特定表的数据的查询结果重复使用。View只能查询,不能修改和插入。
    视图中封装了查询表的SQL语句,并没有存真实的数据,通过视图中的SQL可以获取数据。

    注意:如果从内存中获取数据,Spark可以知道数据类型具体是什么,如果是数字,默认作为Int处理,但是从文件中读取的数字不能确定是什么类型,所以用BigInt接收,可以和Long类型转换,但是和Int不能进行转换。
    SparkSQL读取文件默认的采用parquet格式。

SparkSQL 写入模式:

  1. 默认 : 存在即报错 如果目录不存在,正常写入,如果目录存在,报错。
  2. 追加 : 如果目录不存在,正常写入,如果目录存在,追加写入。
  3. 复写 :如果目录不存在,正常写入,如果目录存在,覆盖写入。
  4. 忽略 : 如果目录不存在,正常写入,如果目录存在,忽略。

Mysql 交互:

  1. Sparksql往mysql里面写数据,如果mysql里面不存在这个表,会自动创建这个表。
  2. 如果mysql里面表已经存在,就需要设置一个写入模式,否则会报错。
  3. 生产环境中,慎用Overwrite写入模式,因为spark会删除Mysql的表,重新创建一个同名的表,慎用,数据无价。
  4. 生产环境中,我们一般都用append模式,但是追加数据的时候需要注意一下mysql表的主键问题。
  5. DF往mysql里面插入数据,顺序不重要,但是df的字段名 和 Mysql表的字段名一定要一直,否则报错。
  6. Mysql表的字段可以比df的字段多,多的字段为null,但是不报错.如果mysql表的字段比df少了.直接报错。

SparkSQL与Hive:

  • 内嵌Hive:

    Spark内嵌小型Hive,不做配置通过SparkShell 直接进行sql查询,会在Spark路径下创建metadata和derby.log 用于存储元数据。(很少用)

  • 外部Hive:

    需要‘Hive-site.xml‘配置文件。并且Spark还提供了SparkSQL CLI客户端,通过‘spark-sql‘可以直接进行SQL语言的查询。

  • IDEA :

  1. 三个依赖:‘Spark-sql‘、‘mysql-connector-java‘、‘spark-hive‘。
  2. 配置文件:‘Hive-site.xml‘ 拷贝到resources。

SparkSQL的join实现方式:

  1. Broadcast Hash Join:适合一张很小的表和一张大表进行Join。
  2. Shuffle Hash Join:适合一张小表(比上一个大一点)和一张大表进行Join。
  3. Sort Merge Join:适合两张大表进行Join。

Spark SQL

上一篇:oracle保存小数点前为"0"的问题


下一篇:sqlldr 导入有中文乱码问题