hive小知识(牢记)

1.EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION), Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

2.STORED AS 指定存储文件类型常用的存储文件类型: SEQUENCEFILE(二进制序列文件)、 TEXTFILE(文本)、
RCFILE(列式存储格式文件)如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,
使用 STORED AS SEQUENCEFILE。

3.默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表, Hive 会(或多或少地) 控制着数据的生命周期。 Hive 默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir(例如, /user/hive/warehouse)所定义的目录的子目录下。 当 我 们删除一个管理表时, Hive 也会删除这个表中数据。 

4.cluser by

当 distribute by 和 sorts by 字段相同时,可以使用 cluster by 方式。cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能。但是排序只能是升序排序, 不能指定排序规则为 ASC 或者 DESC。

5.分桶

分区针对的是数据的存储路径;分桶针对的是数据文件。分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区,特别是之前所提到过的要确定合适的划分大小这个疑虑。分桶是将数据集分解成更容易管理的若干部分的另一个技术。

6.空字段赋值

NVL: 给值为 NULL 的数据赋值, 它的格式是 NVL( string1, replace_with)。它的功能是如果
string1 为 NULL,则 NVL 函数返回 replace_with 的值,否则返回 string1 的值,如果两个参
数都为 NULL ,则返回 NULL。

7.行转列

CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;
CONCAT_WS(separator, str1, str2,...):它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;
COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生 array 类型字段。

8.列转行

EXPLODE(col): 将 hive 一列中复杂的 array 或者 map 结构拆分成多行。
LATERAL VIEW
用法: LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:用于和 split, explode 等 UDTF 一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

8.窗口函数

OVER(): 指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化
而变化;
CURRENT ROW:当前行;
n PRECEDING:往前 n 行数据;
n FOLLOWING:往后 n 行数据;
UNBOUNDED:起点, UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED
FOLLOWING 表示到后面的终点;
LAG(col,n):往前第 n 行数据;
LEAD(col,n):往后第 n 行数据;
NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从 1 开始,
对于每一行, NTILE 返回此行所属的组的编号。 注意: n 必须为 int 类型。

9.RANK

RANK() 排序相同时会重复,总数不会变
DENSE_RANK() 排序相同时会重复,总数会减少
ROW_NUMBER() 会根据顺序计算

10.函数

1) UDF(User-Defined-Function)
一进一出
(2) UDAF(User-Defined Aggregation Function)
聚集函数,多进一出
类似于: count/max/min
(3) UDTF(User-Defined Table-Generating Functions)
一进多出
如 lateral view explore()

编程步骤
(1)继承 org.apache.hadoop.hive.ql.UDF
(2)需要实现 evaluate 函数; evaluate 函数支持重载;
(3) 在 hive 的命令行窗口创建函数
a)添加 jar
add jar linux_jar_path
b)创建 function
create [temporary] function [dbname.]function_name AS
class_name;
(4)在 hive 的命令行窗口删除函数
Drop [temporary] function [if exists]
[dbname.]function_name;

11.压缩

开启 map 输出阶段压缩可以减少 job 中 map 和 Reduce task 间数据传输量。

1.开启 hive 中间传输数据压缩功能
hive (default)>set hive.exec.compress.intermediate=true;
2.开启 mapreduce 中 map 输出压缩功能
hive (default)>set mapreduce.map.output.compress=true;
3.设置 mapreduce 中 map 输出数据的压缩方式
hive (default)>set mapreduce.map.output.compress.codec=
org.apache.hadoop.io.compress.SnappyCodec;
4.执行查询语句
hive (default)> select count(ename) name from emp;

开启 Reduce 输出阶段压缩

当 Hive 将 输 出 写 入 到 表 中 时 , 输 出 内 容 同 样 可 以 进 行 压 缩 。 属 性hive.exec.compress.output 控制着这个功能。用户可能需要保持默认设置文件中的默认值false,这样默认的输出就是非压缩的纯文本文件了。用户可以通过在查询语句或执行脚本设置这个值为 true,来开启输出结果压缩功能。

1.开启 hive 最终输出数据压缩功能
hive (default)>set hive.exec.compress.output=true;
2.开启 mapreduce 最终输出数据压缩
hive (default)>set
mapreduce.output.fileoutputformat.compress=true;
3.设置 mapreduce 最终数据输出压缩方式
hive (default)> set
mapreduce.output.fileoutputformat.compress.codec =
org.apache.hadoop.io.compress.SnappyCodec;
4.设置 mapreduce 最终数据输出压缩为块压缩
hive (default)> set
mapreduce.output.fileoutputformat.compress.type=BLOCK;
5.测试一下输出结果是否是压缩文件
hive (default)> insert overwrite local directory
'/opt/module/datas/distribute-result' select * from emp
distribute by deptno sort by empno desc;

12.文件存储格式

Hive 支持的存储数的格式主要有: TEXTFILE 、 SEQUENCEFILE、 ORC、 PARQUET。

TEXTFILE 和 SEQUENCEFILE 的存储格式都是基于行存储的;
ORC 和 PARQUET 是基于列式存储的。

1. 行存储的特点
查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列
的值,行存储只需要找到其中一个值,其余的值都在相邻地方, 所以此时行存储查询的速度
更快。

2. 列存储的特点
因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的
数据量;每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算
法。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值