Hive常见知识点

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';

结果:

cookieid day pv rn1 rn2 rn3
cookie1 2015-04-12 7 1 1 1
cookie1 2015-04-11 5 2 2 2
cookie1 2015-04-15 4 3 3 3
cookie1 2015-04-16 4 3 3 4
cookie1 2015-04-13 3 5 4 5
cookie1 2015-04-14 2 6 5 6
cookie1 2015-04-10 1 7 6 7

我们发现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,
        DEDUCTIONS MAP,
        ADDRESS STRUCT
    )
    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;

 

 

 

 
 

你可能感兴趣的:(大数据,Hive,数据处理)