Spark学习(柒)- Spark SQL扩展和总结

文章目录

    • Spark SQL使用场景
    • Spark SQL 原理
      • SQL Analyzer
      • SQL Optimizer
      • SQL Optimizer 谓词下推
      • SQL Optimizer 列值裁剪
      • SQL Planner
    • Spark SQL加载数据
      • 1) RDD DataFrame/Dataset
      • 2) Local Cloud(HDFS/S3)
    • DataFrame与SQL的对比
    • Schema
    • SaveMode
    • 处理复杂的JSON数据
    • SQL的覆盖程度
    • 外部数据源

Spark SQL使用场景

  • 文件中数据的特殊查询(即席查询;即席查询是可以进行特殊的字段查询自定义的查询;普通查询就是别人已经定义好的查询方式)
  • 实时SQL分析流数据
  • 可以进行ETL操作
  • 与外部数据库的交互
  • 具有更大集群的可伸缩查询性能

Spark SQL 原理

Spark学习(柒)- Spark SQL扩展和总结_第1张图片
求大于18岁的同学总成绩平均分

原理
Spark学习(柒)- Spark SQL扩展和总结_第2张图片
SQL Parser
Spark学习(柒)- Spark SQL扩展和总结_第3张图片

SQL Analyzer

  1. 经过Parser之后的LogicalPlan并不知道如何执行
  2. 需要绑定不确定的属性和关系
  • 解析表名
    • 临时表
    • 临时view
    • hive table
    • hive view
  • 解析具体的schema结构
    • 字段类型
    • 存储位置
      Spark学习(柒)- Spark SQL扩展和总结_第4张图片

SQL Optimizer

Spark学习(柒)- Spark SQL扩展和总结_第5张图片

SQL Optimizer 谓词下推

Spark学习(柒)- Spark SQL扩展和总结_第6张图片

SQL Optimizer 列值裁剪

Spark学习(柒)- Spark SQL扩展和总结_第7张图片

SQL Planner

Spark学习(柒)- Spark SQL扩展和总结_第8张图片

Spark SQL加载数据

  • 直接将数据加载到一个DataFrame中
  • 将数据加载到RDD并进行转换
  • 可以从本地和云端加载数据

启动一个spark-shell
在这里插入图片描述

1) RDD DataFrame/Dataset

用本地spark的启动日志来进行测试

//将数据加载成RDD
val masterLog = sc.textFile("file:///home/hadoop/app/spark-2.1.0-bin-2.6.0-cdh5.7.0/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-hadoop001.out")
val workerLog = sc.textFile("file:///home/hadoop/app/spark-2.1.0-bin-2.6.0-cdh5.7.0/logs/spark-hadoop-org.apache.spark.deploy.worker.Worker-1-hadoop001.out")
val allLog = sc.textFile("file:///home/hadoop/app/spark-2.1.0-bin-2.6.0-cdh5.7.0/logs/*out*")

Spark学习(柒)- Spark SQL扩展和总结_第9张图片
在这里插入图片描述
Spark学习(柒)- Spark SQL扩展和总结_第10张图片
输出查看
Spark学习(柒)- Spark SQL扩展和总结_第11张图片
存在的问题:如何使用SQL进行查询呢?

//转换成DataFrame
import org.apache.spark.sql.Row
val masterRDD = masterLog.map(x => Row(x))
import org.apache.spark.sql.types._
val schemaString = "line"

val fields = schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, nullable = true))
val schema = StructType(fields)

val masterDF = spark.createDataFrame(masterRDD, schema)
masterDF.show

Spark学习(柒)- Spark SQL扩展和总结_第12张图片
在这里插入图片描述
在这里插入图片描述
把DF转换成一个表;使用SQL操作
在这里插入图片描述

如果文件是JSON/Parquet格式;不需要创建schema;DF可以直接拿取。

val usersDF = spark.read.format("parquet").load("file:///home/hadoop/app/spark-2.1.0-bin-2.6.0-cdh5.7.0/examples/src/main/resources/users.parquet")
usersDF.show

sql里Spark提供了直接使用sql来查询parquet文件。

spark.sql("select * from  parquet.`file:///home/hadoop/app/spark-2.1.0-bin-2.6.0-cdh5.7.0/examples/src/main/resources/users.parquet`").show

2) Local Cloud(HDFS/S3)

从Cloud读取数据: HDFS/S3(s3a/s3n)

val hdfsRDD = sc.textFile("hdfs://path/file")
val s3RDD = sc.textFile("s3a://bucket/object")
spark.read.format("text").load("hdfs://path/file")
spark.read.format("text").load("s3a://bucket/object")

DataFrame与SQL的对比

  • DataFrame=RDD+Schema
  • DataFrame只是一个Dataset的row类型别名
  • 在RDD上的DataFrame:Catalyst optimization&schemas
  • DataFrame可以处理:Text、JSON、Parquet等等
  • DF中的API和SQL函数都是经过Catalyst优化的

Schema

隐式的(inferred):比如Parquet,orc等
显式的(explicit):比如文本文件

示例操作
https://blog.csdn.net/bingdianone/article/details/84580342#t5

SaveMode

Loading&Saving Results
Save操作可以选择使用SaveMode,它指定如何处理现有数据。
Spark学习(柒)- Spark SQL扩展和总结_第13张图片

val df=spark.read.format("json").load("file:///home/hadoop/app/spark-2.1.0-bin-2.6.0-cdh5.7.0/examples/src/main/resources/people.json")

df.show

df.select("name").write.format("parquet").mode("overwrite").save("file:///home/hadoop/data/overwrite")

Spark学习(柒)- Spark SQL扩展和总结_第14张图片

处理复杂的JSON数据

  • JSON数据最容易在换行时被读入
  • Schema是很容易进行推导的
  • 如果你希望flat你的JSON数据,请使用explode方法
  • 使用点语法访问嵌套对象
    Spark学习(柒)- Spark SQL扩展和总结_第15张图片
    临时表操作
    Spark学习(柒)- Spark SQL扩展和总结_第16张图片
    Spark学习(柒)- Spark SQL扩展和总结_第17张图片
    内嵌式的json访问
    在这里插入图片描述
    Spark学习(柒)- Spark SQL扩展和总结_第18张图片
    注册成临时表
    Spark学习(柒)- Spark SQL扩展和总结_第19张图片
    Spark学习(柒)- Spark SQL扩展和总结_第20张图片

SQL的覆盖程度

  • SQL 2003的支持
  • 运行99个TPC-DS基准测试查询
  • 子查询支持
  • 向量化支持(一次可以读取1024行)

外部数据源

  • rdbms、need JDBC jars
  • Parquet、Phoenix、csv、 avro etc

https://blog.csdn.net/bingdianone/article/details/84585293

你可能感兴趣的:(Spark学习笔记)