hive-分析函数

bitmap
--------------
    位图/位映射。
    5

hive
--------------
    分区表
    udtf函数
    wordcount
    lateral view            //和udtf配合使用。
    order by                //数据倾斜
    sort by                    //reduce内排序
    distribute by            //分区
    cluster by                //sort by + distribute by

hive
--------------
    --显式表头
    hive>set hive.cli.print.header=true ;

hive分析函数
--------------
    1.准备数据
        create table emp
        (
            id int ,
            empno string ,
            age int ,
            salary float ,
            deptno int
        )
        ROW FORMAT DELIMITED
        FIELDS TERMINATED BY ‘,‘
        STORED AS TEXTFILE;

    2.加载数据
        1,tom1,28,3000,1
        2,tom2,29,5000,2
        3,tom3,30,5400,1
        4,tom4,28,6600,3
        5,tom5,27,8000,2
        6,tom6,35,10000,3

    3.加载数据
        load data local inpath ‘/home/centos/emp.txt‘ into table emp ;

hive分区函数应用
-----------------
    0.简介
        hive分析函数可以连接每条记录形成数据集,字段甚至可以不是分组字段,使用一次mr
        完成聚合查询。
        常规的sql下的分组聚合很诸多限制,其中select字段必须是分组字段,有时需要多次mr.
        select deptno , max(salary) from emp group by deptno ;
    1.分析函数
        -- over , 只是分区
        SELECT id, empno, salary ,deptno ,max(salary) OVER (PARTITION BY deptno) AS max from emp  ;

        -- OVER + ORDER BY , 分区并在分区内排序
        SELECT empno, deptno, salary ,SUM(salary) OVER(PARTITION BY deptno ORDER BY salary) AS t1 from emp;

        -- OVER ... rows unbounded preceding 基于前导所有行的汇总操作。
        SELECT empno, deptno, salary , SUM(salary) OVER(ORDER BY deptno, empno rows unbounded preceding) AS t3 from emp ;

        -- RANK, 排名操作 ,计算每个部门内按照工资的降序进行排名(有缝,并列情况存在缝隙)绝对排名。
        SELECT empno, deptno, salary,  RANK() OVER (PARTITION BY deptno ORDER BY salary desc) from emp ;

        -- dense_rank()密度排名,无缝。绝对排名。
        SELECT empno, deptno, salary,  Dense_RANK() OVER (PARTITION BY deptno ORDER BY salary desc) from emp ;

        -- percent_rank()百分比排名,相对排名.
        SELECT empno, deptno, salary,  percent_RANK() OVER (PARTITION BY deptno ORDER BY salary desc) from emp ;

        --NTILE(n) ,分桶操纵,将数据均匀分散到各个桶中。
        SELECT empno, deptno, salary , NTILE(4) OVER(PARTITION BY deptno ORDER BY salary desc) AS t1 from emp ;

        -- lead()前导操作,查询从当前开始,后续第几行的操作。
        SELECT empno, deptno, salary, LEAD(salary, 2) OVER(PARTITION BY deptno ORDER BY salary desc) AS t1 from emp ;

        --lag,从当前行计数,访问之前的第几行salary,如果超过窗口范围返回null。
        SELECT empno, deptno, salary, lag(salary, 1) OVER(PARTITION BY deptno ORDER BY salary desc) AS t1 from emp ;

        --first_value()
        SELECT empno, deptno, salary, first_value(salary) OVER(PARTITION BY deptno ORDER BY salary desc) AS t1 from emp ;

        --last_value()
        SELECT empno, deptno, salary, last_value(salary) OVER(PARTITION BY deptno ORDER BY salary desc) AS t1 from emp ;

        --使用range开窗函数 RANGE BETWEEN ... AND ...,在分区内在划分记录范围。
        SELECT empno, deptno, salary, LAST_VALUE(salary) OVER (PARTITION BY deptno ORDER BY salary desc RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS t1 from emp ;

        SELECT empno, deptno, salary, LAST_VALUE(salary) OVER (PARTITION BY deptno ORDER BY salary desc rows BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS t1 from emp ;

        --RANGE : 对值的+/-.
        SELECT empno, deptno, salary, LAST_VALUE(salary) OVER (PARTITION BY deptno ORDER BY salary desc RANGE BETWEEN UNBOUNDED PRECEDING AND current row) AS t1 from emp ;
        SELECT empno, deptno, salary, LAST_VALUE(salary) OVER (PARTITION BY deptno ORDER BY salary desc rows BETWEEN UNBOUNDED PRECEDING AND current row) AS t1 from emp ;

        --range : 计算的是值
        SELECT empno, deptno, salary, LAST_VALUE(salary) OVER (PARTITION BY deptno ORDER BY salary desc RANGE BETWEEN 2000 PRECEDING AND 2000 FOLLOWING) AS t1 from emp ;
        //rows计算的行
        SELECT empno, deptno, salary, LAST_VALUE(salary) OVER (PARTITION BY deptno ORDER BY salary desc rows BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS t1 from emp ;

        --窗口重用
        SELECT empno, deptno, salary , MAX(salary) OVER w1 AS mx,MIN(salary) OVER w1 AS mn,AVG(salary) OVER w1 AS ag from emp WINDOW w1 AS (PARTITION BY deptno ORDER BY salary desc ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) ;

        [开窗函数]
        range|rows between ... and ;
        range是值偏移,rows是行偏移。

    2.统计员工数量
        select max(salary) from emp group by deptno union select max(salary) from emp group by age union select max(salary) from emp group by deptno,age ;

hive高级聚合
---------------
    1.grouping set
        作用等同于union.
        select deptno , age , count(1) from emp group by deptno,age grouping sets(deptno ,age ,(deptno,age) ) ;
    3.rollup
        select ... from ... GROUP BY a,b,c WITH ROLLUP ;
        select ... from ... GROUP BY a,b,c GROUPING SETS ((a,b,c),(a,b),(a),())

        select deptno , age , count(1) from emp group by deptno,age with rollup ;
    4.cube
        select ... from ... GROUP BY a,b,c WITH cube ;
        select ... from ... GROUP BY a,b,c GROUPING SETS ((a),(a,b),(a,c),(a,b,c) ,(b),(b,c),(c),()))

        select deptno , age , count(1) from emp group by deptno,age with cube ;

hive优化
-------------------
    1.创建索引
        本质上就是表,对于检索单条记录是有优势的。
        排序的。
        --创建索引
        CREATE INDEX idx_emp ON TABLE emp (empno) AS ‘COMPACT‘ WITH DEFERRED REBUILD;

        --生成索引
        ALTER INDEX idx_emp ON emp REBUILD;

        --查询是通过索引列查询
        select * from emp where empno = ‘tom1‘

    2.文件格式
        [列存储格式]
        parquet , orcfile , orc    //
        投影查询时,发挥磁盘的线性读写。
        select id,name from emp ;
        //创建表,存储成parquet格式
        create table pq1(id int , empno string, age int ,salary float ,  deptno int ) stored as parquet ;

        //查看文件格式
        insert into pq1 select * from emp ;
        [行存储]
        txt 

    3.压缩
        减少数据传输量,降低网络IO的负载。
        --在多级job中,job之间的结果是否需要压缩。
        SET hive.exec.compress.intermediate=true ;
        SET hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec ;
        SET hive.intermediate.compression.codec=org.apache.hadoop.io.compress.GzipCodec ;
        SET hive.intermediate.compression.type=record|block|none ;

        --控制job的最终输出是否压缩.
        SET hive.exec.compress.output=true;
        SET mapred.output.compression.codec= org.apache.hadoop.io.compress.GzipCodec;

    4.大量小文件
        导致map过多。
        1.归档
            hadoop Archive and HAR进行归档。

        2.转换成序列文件
            将小文件合成SeqenceFile.

        3.org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat
            alter table emp set inputformat=org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat
            --修改默认输入格式
            set hive.input.format=org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat ;

            --建新表
create table emp2
(
id int ,
empno string ,
age int ,
salary float ,
deptno int
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘,‘
STORED AS
INPUTFORMAT ‘org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat‘
OUTPUTFORMAT ‘org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat‘

原文地址:https://www.cnblogs.com/zyde/p/9225353.html

时间: 2024-11-09 05:15:40

hive-分析函数的相关文章

HIVE分析函数

hive支持的分析函数: 总的概括:http://www.07net01.com/linux/HIVE_chuangkoujifenxihanshu_yingyongchangjing_532180_1373989446.html ******************************************************************************************************** Rank over的用法:http://www.cnblo

HADOOP docker(六):hive简易使用指南

前言1.hive简介1.1 hive组件与相应功能:1.2 hive的表类型1.3 分区表1.3 分隔符1.4 hive的数据存储2.数据类型2.1 基本数据类型2.1 复杂数据类型2.3 NULL3.基本操作3.1 数据库操作3.2 表操作3.3 视图3.4 数据导入导出3.hsql3.1 hsql基本操作3.2 hive内置函数3.2 自定义函数3.3 注册函数4.hive权限管理4.1 权限简介4.2 权限分类4.3 授权管理5.hive优化 前言 本手册介绍了hive的基本知识及工作中要

Hive基础(1)---Hive是什么

1. Hive是什么 Hive是基于Hadoop的数据仓库解决方案.由于Hadoop本身在数据存储和计算方面有很好的可扩展性和高容错性,因此使用Hive构建的数据仓库也秉承了这些特性. 这是来自官方的解释. 简单来说,Hive就是在Hadoop上架了一层SQL接口,可以将SQL翻译成MapReduce去Hadoop上执行,这样就使得数据开发和分析人员很方便的使用SQL来完成海量数据的统计和分析,而不必使用编程语言开发MapReduce那么麻烦. 先上一张经典的Hive架构图: Hive架构图 如

hive内置函数详解(分析函数、窗口函数)

cli命令 show functions; desc function concat; desc function extended concat;查看某个函数怎么使用的例子 nvl函数coalesce(v1,v2,...)返回参数中第一个非空值,如果所有值都为null返回null: set.cli.print.header=true; winfunc 员工 工资 标识 id  money type 关系型运算符优先级高到低为:not and orand or 优先级 select id ,mo

我为什么学习hive窗口分析函数

1. 窗口函数 LEAD(column_name, n, default_value),用于统计窗口内往下第n行的值, LAG(column_name, n, default_value),用于统计窗口内往上第n行的值. FIRST_VALUE(column_name),分组窗口排序后,截止到当前行的第一个值: LAST_VALUE(column_name),分组窗口排序后,截止当前航的最后一个值: 2. OVER语句 SUM/COUNT/MIN/MAX/AVG(column_name) OVE

Hive 窗口分析函数

1.窗口函数 1.LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值 第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL) 2.LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值 第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL) 3.FIRST_VALUE(col,false) 用于统

hive row_number等窗口分析函数

一.排序&去重分析 row_number() over(partititon by col1 order by col2) as rn 结果:1,2,3,4 rank() over(partititon by col1 order by col2) as rk 结果:1,2,2,4,5 dense_rank() over(partititon by col1 order by col2) as ds_rk 结果:1,2,2,3,4 select order_id, departure_date,

Hive常见内置函数及其使用

函数分类 HIVE CLI命令 显示当前会话有多少函数可用 SHOW FUNCTIONS; 显示函数的描述信息 DESC FUNCTION concat; 显示函数的扩展描述信息 DESC FUNCTION EXTENDED concat; 简单函数 函数的计算粒度为单条记录. 关系运算 数学运算 逻辑运算 数值计算 类型转换 日期函数 条件函数 字符串函数 统计函数 聚合函数 函数处理的数据粒度为多条记录. sum()-求和 count()-求数据量 avg()-求平均直 distinct-求

Hive分组取Top N

Hive在0.11.0版本开始加入了row_number.rank.dense_rank分析函数,可以查询分组排序后的top值 说明: row_number() over ([partition col1] [order by col2]) rank() over ([partition col1] [order by col2]) dense_rank() over ([partition col1] [order by col2]) 它们都是根据col1字段分组,然后对col2字段进行排序,