Hive day03

  • 目录

    1.table

    1.内部表、外部表

    2.普通表、分区表

    3.静态分区和动态分区

    2.相互转换

    3.复杂数据类型

    1.arrays

    2.maps

    3.structs:  java bean 

    4.开窗函数

  • 1.table

    • 1.内部表、外部表

      • 内部表(Managed tables):手hive管控的表
      • 外部表(External tables):
      • 案例
        • 创建一个内部表(默认为内部表)
           create table emp_mannger as select * from emp;
          • 查看信息:desc formatted emp;
        • 创建一个外部表
          CREATE External TABLE emp_manager2 (
            empno decimal(4,0) ,
            ename string ,
            job string ,
            mgr decimal(4,0) ,
            hiredate string ,
            sal decimal(7,2) ,
            comm decimal(7,2) ,
            deptno decimal(2,0) 
          ) 
          row format  delimited fields terminated by ','
          stored as textfile;
          • 查看信息 : desc formatted emp_manager2;
    • 2.普通表、分区表

      • 区别
        • 普通表:一般维护的数据量较少
        • 分区表:dt
      • 普通表
        • 内部表
        • 外部表
      • 分区表
        Hive day03_第1张图片
        提高查询效率
        • 内部表
        • 外部表
        • 1. hive中多一个或者多个分区
        • 2.过程
          • 创建数据
          • 创建分区表
          • 插入数据
          • 查看表中分区:show partitions 表名;
            Hive day03_第2张图片
          • 删除分区: alter table order_info drop PARTITION(dt='dt值');
            Hive day03_第3张图片
        • 案例  (emp创建分区表)
          • 数据
            7369,SMITH,CLERK,7902,1980-12-17 ,800,,20
            7499,ALLEN,SALESMAN,7698,1981-2-20 ,1600,300,30
            7521,WARD,SALESMAN,7698,1981-2-22 ,1250,500,30
            7566,JONES,MANAGER,7839,1981-4-2 ,2975,,20
            7654,MARTIN,SALESMAN,7698,1981-9-28 ,1250,1400,30
            7698,BLAKE,MANAGER,7839,1981-5-1 ,2850,,30
            7782,CLARK,MANAGER,7839,1981-6-9 ,2450,,10
            7788,SCOTT,ANALYST,7566,1982-12-9 ,3000,,20
            7839,KING,PRESIDENT,,1981-11-17 ,5000,,10
            7844,TURNER,SALESMAN,7698,1981-9-8 ,1500,0,30
            7876,ADAMS,CLERK,7788,1983-1-12 ,1100,,20
            7900,JAMES,CLERK,7698,1981-12-3 ,950,,30
            7902,FORD,ANALYST,7566,1981-12-3 ,3000,,20
            7934,MILLER,CLERK,7782,1982-1-23 ,1300,,10
          • 创建表
            CREATE  TABLE emp_p (
              empno decimal(4,0) ,
              ename string ,
              job string ,
              mgr decimal(4,0) ,
              hiredate string ,
              sal decimal(7,2) ,
              comm decimal(7,2)
            ) 
            PARTITIONED BY (deptno decimal(2,0))
            row format  delimited fields terminated by ','
            stored as textfile;
          • 导入数据
            • load data local inpath "/home/hadoop/tmp/emp_p.txt" into table emp_p partition(deptno=30);
              这种方法会将表格中所有数据导入,并将deptno赋值30
              如要使用需修改emp_p.txt中数据
            • 常用方法
              insert into table emp_p partition(deptno=20)
              select
              empno,
              ename,
              job  ,
              mgr  ,
              hiredate,
              sal  ,
              comm 
              from emp where deptno=20;
              
              //覆盖数据
              insert overwrite table emp_p partition(deptno=20)
              select
              empno,
              ename,
              job  ,
              mgr  ,
              hiredate,
              sal  ,
              comm 
              from emp where deptno=20;

          • 一个sql 把所有数据落到对应的分区里面
            set hive.exec.dynamic.partition.mode=nonstrict;
            insert overwrite table emp_p partition(deptno)
            select
            empno,
            ename,
            job  ,
            mgr  ,
            hiredate,
            sal  ,
            comm ,
            deptno
            from emp;

      • 3.静态分区和动态分区

        • 静态分区
          insert overwrite table emp_p paritition(deptno=xxx)
          select 
          xx 
          from emp where deptno=xxxx
        • 动态分区
          动态分区: 正确的数据 落到正确的分区
          set hive.exec.dynamic.partition.mode=nonstrict;
          insert overwrite table emp_p paritition(deptno)
          select 
          xx 
          from emp;
          •  hive 分区表插入数据: deptno 
            insert overwrite table emp_p partition(deptno)
            select
            empno,
            ename,
            job  ,
            mgr  ,
            hiredate,
            sal  ,
            comm ,
            deptno
            from emp where deptno=20;
            
            insert overwrite table emp_p partition(deptno)
            select
            empno,
            ename,
            job  ,
            mgr  ,
            hiredate,
            sal  ,
            comm ,
            20 as deptno
            from emp where deptno=20;

  • 2.相互转换

    • alter table emp_manager set tblproperties ("EXTERNAL"="false");
    • alter table emp_external set tblproperties ("EXTERNAL"="true");
  • 3.复杂数据类型

    • 1.arrays

      • 在表里面 有一个字段定义成数据类型 放不同的数据类型的数据
      • 案例
        • 数据
          路径:/home/hadoop/tmp/hive_array.txt
          内容:zhangsan    beijing,shanghai,dalian,shenyang
                     lisi    chengdu,hangzhou,shanghai,wuxi
        • 建表
          create table hive_array(
          name string,
          locations array
          )
          row format  delimited fields terminated by '\t'
          collection items terminated by ',';
        • 插入数据:load data local inpath '/home/hadoop/tmp/hive_array.txt' into table hive_array;
        • 问题:
          • 1.查询每个用户第一个工作地点?
            select  name ,locations[0] as first_loc_work from  hive_array;
          • 2.查询每个人 工作地点的数量
            select  name , size(locations) from  hive_array ;
          • 3.查询在shanghai 工作的有哪些人 
            select  * from hive_array  where array_contains(locations,'shanghai');
            
          • 4.行转列
            select name,location
            from hive_array lateral view explode(locations) loc_table as location;

    • 2.maps

      • MAP 
      • 案例
        • 数据
          • 路径 :/home/hadoop/tmp/hive_map.txt
          • 内容 :1,zhangsan,father:xiaoming#mother:xiaohuang#brother:xiaoxu,28
                        2,lisi,father:mayun#mother:huangyi#brother:guanyu,22
                        3,wangwu,father:wangjianlin#mother:ruhua#sister:jingtian,29
                        4,mayun,father:mayongzhen#mother:angelababy,26
        • 建表
          create table hive_map(
          id int  comment '用户id',
          name string comment '用户名字',
          relation map comment '家庭成员',
          age int comment '年龄'
          )
          row format  delimited fields terminated by ','
          collection items terminated by '#'
          map keys terminated by ':';
        • 插入数据:load data local inpath '/home/hadoop/tmp/hive_map.txt' into table hive_map;
        • 问题
          • 1.查询表中每个人的father的名字
            select id,name,age,relation['father'] as father from hive_map;
          • 2.查询表中 每个人的家庭成员  
            select id,name,age,map_keys(relation) as members from hive_map;
          • 3.查询表中 每个人的家庭成员的名字 values
            select id,name,age,map_values(relation) as members from hive_map;
          • 4.查询表中 有brother的人以及brother的名字
            select  
             id,name,age,relation['brother'] as brother
            from hive_map 
            where 
            relation['brother'] is not null;
            
            或者 
            select  
             id,name,age,relation['brother'] as brother
            from hive_map 
            where 
            array_contains(map_keys(relation), 'brother');

    • 3.structs:  java bean 

      • STRUCT
      • 案例

        • 数据
          • 路径 :/home/hadoop/tmp/hive_structs.txt
          • 内容 :192.168.1.1#zhangsan:40
                        192.168.1.2#lisi:50
                        192.168.1.3#wangwu:60
                        192.168.1.4#zhaoliu:70
        • 建表
          create table hive_struct(
          ip string,
          userinfo STRUCT
          )
          row format  delimited fields terminated by '#'
          collection items terminated by ':';
          
        • 插入数据 :load data local inpath '/home/hadoop/tmp/hive_struct.txt' into table hive_struct;
        • 执行命令 :select ip,userinfo.name as name ,userinfo.age as age from hive_struct;
          Hive day03_第4张图片
    • 4.开窗函数

      • 函数:

        • 1.开窗函数自带的

          • 1.排序相关的

          •  2.串行

        • 2.聚合函数:多行数据按照一定规则 进行聚合为 一行
                            理论上 聚合后的行数 <=聚合前的行数 

          • rank()
            rank() over(partition by xx order by xxx) as rk
            从1开始 按照顺序 生产分组内记录的编号,排序相同会重复 在名次中留下空位

          • row_number()
            row_number() over(partition by xx order by xxx) as rn
            从1开始 按照顺序  生产分组内记录的编号,排序相同不会重复

          • dense_rank()
            dense_rank() over(partition by xx order by xxx) as dk
            从1开始 按照顺序 生产分组内记录的编号,排序相同会重复 在名次中不会留下空位

          • 举例

            • 数据

              甜甜,2022-11-10,1
              甜甜,2022-11-11,5
              甜甜,2022-11-12,5
              甜甜,2022-11-13,3
              甜甜,2022-11-14,2
              甜甜,2022-11-15,4
              甜甜,2022-11-16,4  
            • 创表:create table user_mt3 like user_mt2;

            • 插入数据:load data local inpath '/home/hadoop/tmp/date/mt_test.txt'into table user_mt3;

            • 命令

              select 
              name,
              dt,
              cnt,
              rank() over(partition by name order by cnt desc) as rk,
              row_number() over(partition by name order by cnt desc) as rn,
              dense_rank() over(partition by name order by cnt desc) as dk
              from user_mt3;

              Hive day03_第5张图片

      • 案例
          既要显示聚合前的数据,又要显示聚合后的数据
               id    name  sal     
               1     zs      3w 
               2     ls     2.5w
               3     ww     2w 

        • 需求: 按照工资降序排列 还显示对应的 排名 
              id    name  sal     rank 
              1     zs      3w        1
              2     ls     2.5w       2
              3     ww     2w        3

      • 案例一

        • 数据

          haige,2022-11-10,1
          haige,2022-11-11,5
          haige,2022-11-12,7
          haige,2022-11-13,3
          haige,2022-11-14,2
          haige,2022-11-15,4
          haige,2022-11-16,4
        • 创建表

          create table user_mt2 (
          name string,
          dt string,
          cnt int
          )
          row format  delimited fields terminated by ',' ;
        • 插入数据:load data local inpath '/home/hadoop/tmp/mt.txt' into table user_mt2;

        • 问题: 统计累计问题 ,每个用户每天累计点外卖次数 

          select 
          name ,
          dt ,
          cnt ,
          sum(cnt) over(partition by name  order by dt ) as sum_cnt
          from user_mt2;

          Hive day03_第6张图片

        • 补充:单单一个基本查询 开窗函数 和 group by 不能一起使用

        • 指定窗口大小

          select 
          name ,
          dt ,
          cnt ,
          sum(cnt) over(partition by name  order by dt ) as sum_cnt,
          sum(cnt) over(partition by name  order by dt  ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  ) as sum_cnt2,
          sum(cnt) over(partition by name  order by dt  ROWS BETWEEN 3 PRECEDING AND CURRENT ROW  ) as sum_cnt3,
          sum(cnt) over(partition by name  order by dt  ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING  ) as sum_cnt4
          from user_mt2;

          Hive day03_第7张图片

          •  ROWS BETWEEN 3 PRECEDING AND CURRENT ROW  :上三行 + 本行

          • ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING   :下一行 + 本行

        • select 
          name ,
          dt ,
          cnt ,
          sum(cnt) over(partition by name  order by dt ) as sum_cnt,
          sum(cnt) over(  order by dt ) as sum_cnt1
          from user_mt2;

          Hive day03_第8张图片

      • 案例二

        • 数据

          userid  dt    cnt 
          u01,2017/01/21,5
          u02,2017/01/23,6
          u03,2017/01/22,8
          u04,2017/01/20,3
          u01,2017/01/23,6
          u01,2017/02/21,8
          u02,2017/01/23,6
          u01,2017/02/22,4
        • 需求: 
              使用sql 统计出每个用户每个月的累计访问次数 
          用户id  月份  小计  累计
          u01   2017-01 11   11
          u01   2017-02 12   23
          u02   2017-01 12   12

        • 建表

          create table user_log(
          userid string,
          dt string,
          cnt int
          )
          row format  delimited fields terminated by ',' ;
        • 插入数据

        • load data local inpath "/home/hadoop/tmp/data/exemple/user_visit.txt" into table user_log;

        • 问题

          • 1.求出每个用户每个月的 访问次数

            dt:2017/01/21 => 2017-01-21
            moth:2017-01

            select  
            userid,
            date_format(replace(dt,'/','-'),'YYYY-MM') as moth,
            sum(cnt) cnt_sum
            from user_log
            group by 
            userid,date_format(replace(dt,'/','-'),'YYYY-MM');

            Hive day03_第9张图片

          • 2.基于result 进一步求 累计访问次数

            select 
            userid,
            moth,
            cnt_sum,
            sum(cnt_sum) over(partition by userid  order by moth ) as cnt_all
            from 
            (
            select  
            userid,
            date_format(replace(dt,'/','-'),'YYYY-MM') as moth,
            sum(cnt) as  cnt_sum
            from user_log
            group by 
            userid,date_format(replace(dt,'/','-'),'YYYY-MM')
            ) as a ;
            

            Hive day03_第10张图片

      • 需求: 
            京东店铺 

        • 数据

          [hadoop@bigdata33 data]$ cat user_shop.txt
          user_id  shop
          u1,a
          u2,b
          u1,b
          u1,a
          u3,c
          u4,b
          u1,a
          u2,c
          u5,b
          u4,b
          u6,c
          u2,c
          u1,b
          u2,a
          u2,a
          u3,a
          u5,a
          u5,a
          u5,a

          pv =》 页面浏览量   3个用户 每个人 访问了 10次页面    30
          uv =》 访客次数  3个用户 每个人 访问了 10次页面  3

        • 需求: 

          • 1.每个店铺的uv 

            • 建表

              create table taobao(
              user_id string,
              shop string
              )
              row format delimited fields terminated by ',' ;
            • 插入数据:load data local inpath '/home/hadoop/tmp/data/taobao.txt' into table taobao;

            • 命令

              • count(distinct user_id)   先聚合后join

                select 
                shop, 
                count(distinct user_id) as uv
                from taobao
                group by shop;

                Hive day03_第11张图片

          • 2.一共有几家店铺

            select 
            count(distinct shop) as shop_cnt
            from taobao;

             

          • 3.店铺的访问次数排名

            select
            shop,
            cnt,
            rk
            from
            (
            select
            shop,
            cnt,
            rank() over(order by cnt desc) as rk
            from
            (
            select
            shop,
            count(1) as cnt
            from taobao
            group by shop     
            )as a
            )as a
            where rk < 4;

            Hive day03_第12张图片

          • 4.每个店铺访问次数 top3 的用户记录 
                    输出: 店铺名次 访客id  访问次数

            select
            shop,
            user_id,
            cnt,
            rk
            from
            (
            select
            shop,
            user_id,
            cnt,
            rank() over(partition by shop order by cnt desc) as rk
            from
            (
            select
            shop,
            user_id,
            count(1) as cnt
            from taobao
            group by shop, user_id   
            )as a
            )as a
            where rk < 4;

            Hive day03_第13张图片

             

你可能感兴趣的:(hive,hive,hadoop,数据仓库)