0


Spark SQL

因为整合了hive,所以每次启动hive都需要先启动hive的元数据服务 : root用户操作
nohup hive --service metastore >> metastore.log 2>&1 &

1、spark sql 练习总结 :

(1)使用Spark sql , 需要导入隐式转换
     // spark sql 中必须要导入隐式转换, 才可以使用 $方法 获取列对象
     import spark.implicits._
         
     //导入 DSL 所有的函数
     import org.apache.spark.sql.functions._
 
 
 (2) 凡是涉及到 “累计”   -->  开窗函数 "sum() over"
     
     1、统计 每个公司每年 按月 累计 收入 
        sum(收入) over(partition by 每个公司,每年 order by 月份)
        
        
       1) sum() over 只分区     --  全局求和 (整列结果都一样,是最终结果)
              sum(pic) over(partition by burk,year)
              
       2) sum() over 分区加排序  --  累计求和 (第一行加第二行结果等于第三行结果)
              sum(pic) over(partition by burk,year order by month)
 
 
      2、统计 每个公司 当月比上年同期增长率 
         lag("字段", 1, 默认值)  :  获取上一个字段的值,未获取到取默认值  , 只能用于连续的数据
      
      
      
  (3) 一定要先将DF注册成一张临时的视图 (视图 -- 表的概念,不过视图没有数据)     -- 没有表就没办法写sql
  
       
  (4) explode :  一行转行成多行   ,参数: 数组、集合
  
      // 1、 参数 : Array    一行变一列
         spark.sql(
           """
             |select explode(Array(1,2,3,4,5,6,7))
           """.stripMargin
         ).show()

    //  2、 参数 : map    k,v     一行变两列
         spark.sql(
           """
             |select explode(map('001', 1, '002', 2, '003' , 3))
           """.stripMargin
         ).show()
         
  
  (5) sql行转列 :   lateral view + UDF函数
  
      spark.sql(
       """
         |select *
         |from(
         |   select burk, year, month, pic
         |   from burks
         |   lateral view explode(map(1, tsl01, 2, tsl02, 3, tsl03, 4, tsl04, 5, tsl05, 6, tsl06, 7, tsl07, 8, tsl08, 9, tsl09, 10, tsl10, 11, tsl11, 12, tsl12)) T as month,pic
         | )
       """.stripMargin
     ).show()

     // 直接将explode放在select后面,结果和lateral view效果一样
     spark.sql(
       """
         |select burk, year, explode(map(1, tsl01, 2, tsl02, 3, tsl03, 4, tsl04, 5, tsl05, 6, tsl06, 7, tsl07, 8, tsl08, 9, tsl09, 10, tsl10, 11, tsl11, 12, tsl12)) as (month, pic)
         |from burks
       """.stripMargin
     ).show()
     
     

2、 spark sql 写代码方式 :

 (1) idea里面将代码编写好打包上传到集群中运行,spark-submit提交         -- 上线使用
     
       1、项目打包 :    Maven -> spark -> Lifecycle -> package
                        项目在 target下
       2、上传到服务器任意位置(虚拟机master)
       3、在jars包位置 : spark-submit --master yarn-client --class com.shujia.spark.sql.day05.Demo07Submit spark-1.0.jar
       4、运行之后, 可以查看内容 :  hdfs dfs -cat /data/gender_num/*
     
 
 (2) spark shell  ( 又称 : repl模式    l:循环、r:读、e:执行、p:打印)    -- 测试使用
       
       Linux进入shell命令行:  1、spark-shell (默认local模式)
                              2、spark-shell --master yarn-client 
                                 不能使用yarn-cluster模式,因为Driver必须在本地启动    
                                     
       特点 : 可以边写代码,边出结果,然后可以再继续写代码
              可以将之前的结果存起来, 即代码不需要重复运行 ; 不好的是必须一行写完。
              
       退出 :  Ctrl + Z
               kill -9 (SparkSubmit)进程
       
 
 (3) spark-sql
   
     Linux进入sql命令行:  spark-sql
     
     特点 :  和hive命令行一样,可以写sql ; 不好的是会打印很多日志。
             默认元数据是放在本地文件中的,若切换一个目录再进入spark-sql,就找不到元数据,之前的表就丢了。
             
             Hive最终是把元数据放在mysql里面的; 
             而spark是和hive整合后,将元数据放到mysql里面的。
     
     退出 :  exit;
     
     

3、 Spark整合Hive :

 开启hive元数据服务的目的 :  让spark sql可以获取到hive的元数据
 
 步骤 :
     (1) 在hive的hive-site.xml修改一行配置
         
          cd /usr/local/soft/hive-3.1.2/conf/
          
          vim hive-site.xml
          
          增加 :
             <property>
             <name>hive.metastore.uris</name>
             <value>thrift://master:9083</value>
             </property>
        
        
      **** 至此hive就不能用了。  每次必须先开启元数据服务,才能进入hive  *****
          
      (2) 启动hive元数据服务 :
           nohup  hive --service metastore >> metastore.log 2>&1 &
         
         
          会在根目录下创建metastore.log目录  -- hive的元数据服务日志
          jps后会出现RunJar进程
 

    (3) 将 hive-site.xml  复制到 spark conf 目录下
          cd /usr/local/soft/hive-3.1.2/conf/
     
          cp hive-site.xml /usr/local/soft/spark-2.4.5/conf/

      (4) 将mysql 驱动包复制到spark jars目录下
          cd /usr/local/soft/hive-3.1.2/lib
         
          cp mysql-connector-java-5.1.37.jar /usr/local/soft/spark-2.4.5/jars/

4、整合好之后在 spark-sql 里面就可以使用hive的表了 :

 Linux进入sql命令行: 1、 spark-sql(默认local模式)
                     2、 spark-sql --master yarn-client
                         不能使用cluster模式
                         
 特点 :
     此时, Hive和Spark-sql用的是同一个元数据。
     在Hive里创建一张表, spark-sql里面可以查看到;
     同理,在spark-sql里创建一张表, Hive里面也可以查看到;
     
     
 设置分区数 :
     1、shell命令行:  spark-sql --master yarn-client  --conf  spark.sql.shuffle.partitions=2
     2、在spark-sql中设置:  set spark.sql.shuffle.partitions=2;
     3、在代码中设置 :  .config("spark.sql.shuffle.partitions", 2)
     
     
 spark 和 hive 区别 :
     相同的sql,在spark-sql里面的运行时间是hive的1/10
         因为spark是粗粒度资源调用,hive是细粒度资源调用
         spark可以将数据缓存在内存,而hive只能将数据存在HDFS(磁盘)
     
     
 spark sql 完全兼容hivesql ,hive sql 不完全兼容sparksql
         
 
 (1) spark 独有的 :

     1、缓存表   -- 缓存在内存中
        cache table student;

     2、删除缓存
        uncache table student;
        
 
      3、 广播小表  -- 实现mapjoin      

        在map端实现表关联,将小表加载到内存,小表的大小不能超过一个Executor的内存的0.6
         
         /*+broadcast(a)  */  --> hint语法: sql里的注解的语法

        
         将小表a广播出去 :
             select /*+broadcast(a) */ * from 
             student as a
             join 
             score as b
             on a.id=b.student_id
         
         

5、 hive 写代码不同的方式 :

 (1) hive -e "show tables"    :  执行完sql语句后自动退出hive
 
 (2) 先创建一个文件a.sql, 再在a.sql里面写sql语句 :  select * from students;
     hive -f a.sql  :  执行a.sql里的sql语句
     

6、 spark-sql 也可以 :
(1) spark-sql -e

 (2)  spark-sql -f
     
标签: spark sql 大数据

本文转载自: https://blog.csdn.net/a_black03/article/details/143370860
版权归原作者 小黑03 所有, 如有侵权,请联系我们删除。

“Spark SQL”的评论:

还没有评论