Hive常见知识点

本文详细介绍了Hive中一行转多行、多行转一行、聚合函数配合over()的应用,以及NTILE()函数进行数据切片、ROW_NUMBER、RANK和CUME_DIST等行号和分布函数的使用。同时,探讨了Hive的时间滑窗函数LAG和多维度聚合。文章还提到了Hive中容易被忽视的操作,如创建/删除索引、表/库的创建与删除、数据存储格式、列属性修改、表备份与恢复及权限管理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1, Hive一行转多行:

later view explode函数可以把一行数据通过split函数切为多片作为一个新的列呈现,示例:

CREATE TABLE MY_TABLE1 AS 
   SELECT MID,DEVICE,APP FROM BASE.TMP_TABLE LATER VIEW EXPLODE(SPLIT(APPLIST, ',')) R1 AS APP;

表BASE.TMP_TABLE中原有的字段是MID,DEVICE,APPLIST这三个。R1是使用EXPLODE后必须要加的,而APP是最后起的别名。

2,多行转一行

collect_set(A),其中A必须是字符串,如果不是可以用cast转为string类型,示例:

SELECT MID,DEVICE,COLLECT_SET(APP) AS APPLIST FROM MY_TABLE1
GROUP BY MID,DEVICE

3,聚合函数+over()

    SELECT COOKIEID,
        CREATETIME,
        PV,
        SUM(PV) OVER (PARTITION BY COOKIEID ORDER BY CREATETIME) AS PV1,  --默认计算从起点到当前行的数据
        SUM(PV) OVER(PARTITION BY COOKIEID ORDER BY CTRATETIME ROWS BWTWEEN UNBOUNED PRECEDING AND UNBOUNED FOLLOWING) AS PV2,  --统计从开始到结尾的所有数据
        SUM(PV) OVER(PARTITION BY COOKIEID ORDER BY CREATETIME ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS PV3 -- 统计当前行以及其前两行数据
    FROM TMP_TABLE;
如果不指定order by,会将分组内所有值做运算;
如果不指定ROWS BETWEEN,会默认统计开始到当前的数据;

4,分组后数据切片

分组后的数据有时候需要按照一定的顺序拿出一定的比例。
NTILE()函数可以完成这样的功能,如果切片不均匀,会增加第一个切片的数量。

    SELECT 
        COOKIEID,
        CREATETIME,
        PV,
        NTILE(2) OVER(PARTITION BY COOKIEID ORDER BY CREATETIME) AS RN1, -- 分组内数据切为两份。这里不能使用ROWS BETWEEN
        NTILE(3) OVER(PARTITION BY COOKIEID ORDER BY CREATETIME) AS RN2
    FROM TMP_TABLE
    ORDER BY COOKIEID,CREATETIME;

5,添加行号的三个函数

1,row_number。行号不会出现重复,排序列相同的话,会顺延加1;
2,rank。行号会出现相同的情况。此时相同行号的下一个行号会缺失;
3,dense_rank。会出现重复行号。不会出现缺失行号的情况。
SELECT 
    COOKIEID,
    CREATETIME,
    PV,
    RANK() OVER(PARTITION BY COOKIDID ORDER BY PV DESC) AS RN1,
    DENSE_RANK() OVER(PARTITION BY COOKIDID ORDER BY PV DESC) AS RN2,
    ROW_NUMBER() OVER(PARTITON BY COOKIEID ORDER BY PV DESC) AS RN3
FROM TMP_TABLE
WHERE COOKIEID='cookie1';

结果:

cookieiddaypvrn1rn2rn3
cookie12015-04-127111
cookie12015-04-115222
cookie12015-04-154333
cookie12015-04-164334
cookie12015-04-133545
cookie12015-04-142656
cookie12015-04-101767

我们发现row_number确实不会出现重复的行号,而rank会缺失行号。

6,CUME_DIST函数

小于等于当前值的行数(数据量)在分组内所占的比例。比如说计算部门内小于某个人的工资的人数所占的部门人数:  
SELECT 
    DEPT,
    USERID,
    SAL,
    CUME_DIST() OVER(ORDER BY SAL) AS RN1,
    CUME_DIST() OVER(PARTITION BY DEPT ORDER BY SAL) AS RN2
FROM TMP_TABLE;

7,时间滑窗函数LAG

LAG(col, n, default)用于拿当前行所在的col的前n个值。默认遇到NULL还是NULL,可自定义。
SELECT 
    COOKIEID,
    CREATETIME,
    URL,
    ROW_NUMBER() OVER(PARTITION BY COOKIEID ORDER BY CREATETIME) AS RN,
    LAG(CREATETIME, 1, '1979-01-01 00:00:00') AS LAST_1_TIME,
    LAG(CREATETIME, 2) AS LAST_2_TIME
FROM TMP_TAB;

8,多维度聚合

要实现多维的聚合操作,实际上可以使用union all函数。但是这并不是一个高效的做法,因为如果你是对同一张表进行多维度统计的话,意味着你多次在读取同一张表。有其他一些高效的函数可以完成这个功能:  

1) grouping sets
2) rollup
3) cube
个人更偏爱grouping sets这个方法。

Hive容易忽视的点:

1 如何创建/删除索引

创建索引:CREATE INDEX INDEX_NAME ON TABLE TABLE_NAME(COL_NAME);  
删除索引:DROP INDEX IF EXISTS INDEX_NAME ON TABLE TABLE_NAME;

2 如何创建表/删除表

    创建表:CREATE TABLE EMPLOYEES(
        NAME STRING,
        SALARY FLOAT,
        SUBORDINATES ARRAY<STRING>,
        DEDUCTIONS MAP<STRING,DOUBLE>,
        ADDRESS STRUCT<STREET:STRING,CITY:STRING,STATS:STRING,ZIP INT>
    )
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '\t'
    STORED AS TEXTFILE
    PARTITION BY(DT BIGINT,CITY STRING);
删除表:
    1,永久删除:DROP TABLE TABLE_NAME;
    2,删除某些行的数据:DELETE FROM TABLE_NAME WHERE ...;
    3,删除表中所有数据,保留表结构(不能删除外部表):TRUNCATE TABLE TABLE_NAME;
    4,重命名: ALTER TABLE TAB_NAME RENAME TO NEW_TAB_NAME;

3 如何创建库/删除库

1, 创建库:CREATE DATABASE BASE_NAME;
2, 删除库:DROP DATABASE BASE_NAME;
注:如果库中有表,那这个库是不能被删除的。

4 Hive数据的存储格式

1,TextFile 不支持块压缩,默认格式。磁盘开销大,数据解析开销大;
2,RCFile 支持压缩,快速查询。写入操作比较慢。不支持模式演进;
3,ORCFile RCFile的改进型,列存储,压缩快,存储更快。不支持模式演进;
4,Parquet 写入慢。压缩性、查询性好,支持有限的模式演进。

5 如何修改列的属性

1,新增列:ALTER TABLE TABLE_NAME ADD COLUMN COL_NAME VARCHAR(25) NOT NULL; 
2,修改列位置/类型/注释:ALTER TABLE TAB_NAME CHANGE
                       [COLUMN] COL_OLD_NAME COL_NEW_NAME CLOUMN_TYPE
                       [COMMENT COL_COMMENT]
                       [FIRST|AFTER COLUMN_NAME];
    例子:ALTER TABLE TAB CHANGE COL1 COLX STRING COMMENT 'this is a new comment!' AFTER COL2; -- 将原来的列col1移动到col2后面,叫做colx,并且同时修改了它的comment属性;
          
3,删除一列:ALTER TABLE TAB_NAME DROP COL_NAME;

6 如何备份表/恢复表

1 如果是一张小表:
    先建一张表:CREATE TABLE IF NOT EXISTS LIKE OLD_TAB;
    INSERT OVERWRITE TABLE TAB_NAME SELECT * FROM OLD_TAB; 
2 如果表很大或者是一张分区表:
    1)先建新表:同上
    2)将旧表所在的HDFS目录下所有文件复制到新表下:
        hadoop fs -cp OLD_PATH NEW_PATH;
    3)恢复分区:MASK REPAIR TABLE TAB_NAME;

7 如何给表/库赋予权限

Hive可以通过grant或者revoke命令赋予用户对数据库、表的各种权限。但实际上一般都是
通过赋予用户某几种角色role来管理,这样会很方便。role是一组权限的集合。一个role
可以被赋予多个用户。
1) 创建/删除角色
CREATE/DROP ROLE ROLE_NAME;
2) 角色分配/回收
GRANT ROLE ROLE_NAME TO USER USER_NAME;
REVOKE ROLE ROLE_NAME FROM USER USER_NAME;
3) 角色授权
GRANT/REVOKE PRIV_TYPE ON OBJECT_TYPE OBJECT TO/FROM ROLE ROLE_NAME;
example:
        GRANT SELECT ON DATABASE DB_NAME TO ROLE ROLE_NAME;

 

 

 

 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值