Spark:SQL(二)

本文详细介绍了SparkSQL与Hive的集成,包括场景、设计、开发方式和测试。内容涵盖SparkSQL的DataFrame、DataSet转换,SaveMode,数据源接口,以及如何在SparkShell、IDEA中集成Hive进行测试。同时讲解了自定义UDF和Catalyst优化器的工作原理。此外,还探讨了实时数据计算的需求、架构,以及Spark Streaming的功能和特点。
摘要由CSDN通过智能技术生成

目录

01:上篇回顾

02:课程目标

03:数据源Sink:设计

04:集成Hive:场景及设计

05:集成Hive:SparkShell测试

06:集成Hive:IDEA测试

07:自定义UDF规则

08:自定义UDF测试

09:SparkSQL开发方式

10:SparkSQL开发方式:SQL Shell

11:SparkSQL开发方式:Beeline

12:SparkSQL开发方式:JDBC

13:Catalyst 优化器

14:实时数据计算场景及架构

15:Spark Streaming的功能及特点

16:官方案例Wordcount

17:驱动接口及数据抽象设计

18:自定义开发WordCount

附录一:Maven依赖


01:上篇回顾

https://blog.csdn.net/m0_57498038/article/details/119112063

  1. RDD、DF、DS之间的区别是什么?

    • RDD:分布式数据集合:数据 + 支持泛型

    • DataFrame:分布式数据表:数据 + Schema + 不支持泛型【Row】

    • DataSet:分布式数据表:数据 + Schema + 支持泛型

  2. 怎么实现三者之间的互相转换?

    • DF 、 DS =》 RDD:.rdd

    • RDD =》 DF、DS

      • 方式一:反射:将没有Schema的RDD类型转换有Schema的RDD类型

        • RDD【String】 =》 RDD【CaseClass】

      • 方式二:自定义Schema

        • RDD【Row】 + Schema【StructType【StructFields】】 = DataFrame

    • DF => DS :df.as【CaseClass】

    • DS => DF:toDF(colName)

  3. SaveMode是什么?

    • 保存模式

      • Append:追加

      • Overwrite:覆盖

      • ErrorIfExists:默认,如果存在就报错

      • Ignore:如果存在就忽略

    • csv:文本文件

    • jdbc:问题:主键 + 约束导致如果用追加:主键重复,如果用覆盖,数据丢失

      ds.write.mode.option.jdbc
      • 解决

        • 如果用官方的JDBC:1-建MySQL表时,允许主键自动更新 2-使用追加模式

        • 如果不用官方的JDBC:自己写

          ds.foreachPartition(part => {
              //JDBC
              //replace into 
          })
  4. 如何调整SparkSQL 的聚合Shuffle中的分区个数?

    • 默认分区:200个

    • 修改属性:spark.sql.shuffle.partitions

  5. SparkSQL有哪些常用的数据源接口?

    • Source接口

    • 调用:spark.read.format(“格式”).load(“路径”)

      spark.read.csv/partquet/orc/json/jdbc/table

02:课程目标

  1. SparkSQL与Hive集成

    • SparkSQL为什么要访问Hive,集成基本原理?

    • Spark SQL 集成 Hive 与 Hive on Spark 有什么区别?

    • SparkSQL集成Hive怎么进行开发?

  2. SparkSQL开发方式

    • IDEA + JAR

    • Shell

    • Beeline

    • SQL脚本

    • JDBC

  3. SparkStreaming入门

    • 实时计算的需求以及场景?

    • SparkStreaming的基本设计:驱动接口【StreamingContext】和数据抽象【DStream】

    • 自定义开发一个SparkStreaming程序:Wordcount

03:数据源Sink:设计

  • 目标了解SparkSQL中Sink数据源的设计

  • 实施

    • 设计:非常类似于MR的设计

      • MR的设计

        • 输出:OutputFormat

          • TextOutputFormat:将结果保存为文件

          • DBOutputFormat:将结果保存到MySQL

      • SparkSQL的设计

        • 输出:DataFrameWriter

          • .csv

          • .jdbc

          • .parquet

          • .json

          • ……

    • 语法

      //保存方式一:redis、hbase、JDBC
      df/ds.foreachPartition(自定义保存的逻辑)
      ​
      //保存方式二
      df/ds.write.mode.jdbc => df/ds.write.mode.format("输出的格式").save("路径")
      ​
      //保存方式三
      df/ds
        .write
        .mode(SaveMode.Overwrite)
        .format("指定保存格式")
        .save("保存的路径")/save()/saveAsTable
      • save(Path:String):用于保存文本

      • save():用于保存数据库

      • saveAsTable:保存到Hive表中

  • 小结

    • 了解SparkSQL中Sink数据源的设计

04:集成Hive:场景及设计

  • 目标掌握SparkSQL集成Hive的场景及设计

  • 实施

    • 场景

      • 离线:对数据仓库中的数据进行分布式计算分析处理

        • 数据来源:Hive

      • 实时:对结构化数据进行分布式实时计算

        • 数据来源:Kafka

      • 利用SparkSQL对Hive数据仓库中的数据进行处理分析

    • 设计

      • 所有需要访问Hive数据仓库的分布式计算服务,只要知道metastore服务的地址,就可以访问Hive元数据了

         

    • 配置

      • 启动Hive

        #第一台机器
        start-dfs.sh
        cd /export/server/hive
        bin/hive-daemon.sh metastore
      ​
      ​
      
    • 配置SparkSQL

      • Spark的conf目录中创建hive-site.xml,执行metastore服务地址

        cd /export/server/spark
        vim conf/hive-site.xml
        
        
        <?xml version="1.0"?>
        <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
        <configuration>
            <property>
                <name>hive.metastore.uris</name>
                <value>thrift://node1.itcast.cn:9083</value>
          </property>
        </configuration>

        - 集群模式,需要分发给Spark所有节点 

      • cd conf/ 
        scp hive-site.xml node2:$PWD 
        scp hive-site.xml node3:$PWD

  • 小结

    • 掌握SparkSQL集成Hive的场景及设计

05:集成Hive:SparkShell测试

  • 目标实现SparkShell测试与Hive的集成

  • 实施

    • 启动spark-shell

      bin/spark-shell --master local[2]
    • 方式一

      • 直接写SQL操作Hive表

      • 测试

        spark.sql("show databases").show
        spark.sql("show tables in db_hive").show
        spark.sql("select deptno,round(avg(sal),2) as avgsal from db_hive.emp group by deptno").show
        spark.sql("create table db_hive.tb_test(word string)")

    •  

       

    • 方式二

      • 加载Hive表的数据变成DF,可以调用DSL或者SQL的方式来实现计算

      • 测试

        • step1:读取数据

          val hiveData = spark.read.table("db_hive.emp")
          hiveData.printSchema
          hiveData.show

        • step2:转换数据:统计每个部门的平均薪资

        • val data = hiveData
              .select($"deptno",$"sal")
              .groupBy($"deptno")
              .agg(round(avg($"sal"),2).as("avgsal"))
          rsData.show

        • step3:保存结果

          import org.apache.spark.sql._
          rsData.write.mode(SaveMode.Overwrite).saveAsTable("db_hive.tb_rs")
          spark.sql("select * from db_hive.tb_rs").show

           

        • SparkSQL集成Hive:语法与Hive类似,由SparkSQL解析SQL语句变成SparkCore程序

      • Hive on Spark:Hive底层用SparkCore作为计算引擎,SQL解析由Hive实现,转换为SparkCore程序

        • hive.executor.engine = mr / spark

  • 小结

    • 实现SparkShell测试与Hive的集成

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值