hive使用笔记

一、 相关参考

类别描述链接
官方官方文档https://cwiki.apache.org/confluence/display/Hive/LanguageManual
内置函数LanguageManual UDF - Apache Hive - Apache Software Foundation
华为故障排错https://doc.hcs.huawei.com/zh-cn/usermanual/mrs/mrs_03_0147.html

二、 内置函数

1.  字符串操作

描述类别
字符串函数https://www.iteblog.com/archives/1639.html
rlike,like,not like使用详解https://blog.csdn.net/qq_26442553/article/details/79452221
正则表达式https://www.runoob.com/regexp/regexp-metachar.html

2.  进制转换

语法: conv(bigint num, int from_base, int to_base), conv(string num, int from_base, int to_base)
返回值: string
说明: Converts a number from a given base to another 

-- 十进制转十六进制
hive> select conv(17,10,16);
11
hive> select conv(‘17’,10,16);
11


-- 十进制转二进制
hive> select conv(17,10,2);
10001
hive> select conv(‘17’,10,2);
10001

三、 多表指向同一份数据

1) 创建外表,指向同一个数据源,修复分区(或添加分区);
2) 创建视图;

四、 hive常用命令

1. 查看hive版本

hive --version

2. 表操作

-- 查看表详情
show create table tab_name; -- spark不能获取内表路径
desc formatted tab_name ;

-- 增加表名注释
alter table tab_name set tblproperties('comment' = '这是表注释!');

-- 增加表属性
alter table `tab_name` set tblproperties('owner'='shy');

-- 增加表生命周期
alter table `tab_name` set tblproperties('lifecycle'='-1');

-- 内外表切换(属性值区分大小写)
ALTER TABLE tab_name SET TBLPROPERTIES('EXTERNAL'='true');

-- 增加一列
alter table tab_name add columns(status string comment '注释') cascade;

-- 更改列名及注释
alter table tab_name change column status status string comment 'tid 状态:init/active';

3. 分区操作

-- 添加分区
-- 修复表
set hive.msck.repair.batch.size=1000;
set hive.msck.path.validation=ignore;
msck repair table ssjt.shy;

-- 直接添加
alter table tab_name add if not exists partition (dt='20210830') location 'path';


-- 删除分区
-- 精确删除(hive和spark都支持)
alter table tab_name drop if exists partition(dt='20220105');

-- 区间删除(仅hive支持)
alter table tab_name drop if exists partition(dt>='20220105',dt<='20220108');

-- 批量删除(hive和spark都支持)
alter table tab_name drop if exists partition (dt='20220110'),partition (dt='20220111');

-- 删除分区时不进回收站,删除速度快
alter table tab_name drop if exists partition(dt='20220105') purge;

-- 查看分区信息
show partitions tab_name;
show partitions tab_name partition(dt >= '20221205');
desc formatted tab_name partition(dt='20221205');

4. 传入变量

-- 设定变量
set tab_name=ssjt.shy;
-- 使用变量
show create table ${hiveconf:tab_name};

5. list库和表

使用正则方法查找库名或表名

-- 罗列库名
show databases;
show databases like '*ods*';

-- 罗列表名
show tables in tranadm;
show tables in tranadm  like '*sensor*';

五、 hive参数设置

调节hive的日志级别
hive --hiveconf hive.root.logger=DEBUG,console

-- 递归查询子目录
set hive.input.dir.recursive=true;
set hive.mapred.supports.subdirectories=true;
set hive.supports.subdirectories=true;
set mapred.input.dir.recursive=true;

-- 打开动态分区
set hive.exec.dynamic.partition.mode=nonstrict;

-- 忽略错误继续执行
set hive.continue.on.failure=true;
set hive.cli.errors.ignore=true;

七、删除表或分区慢

对于分区较多或文件较多的表,清空数据或删除表时速度很慢, 可以先删元除数据再删除数据,即内表转外表删除元数据后再删除底层数据;

1. 删除表

-- 转外表
alter table tbl_name set TBLPROPERTIES('EXTERNAL'='true');

-- 删除表
drop table tbl_name;

-- 手动删除底层数据
ossutil rm -rf oss://base_path/aa/

2. 删除表分区

-- 转外表
alter table tbl_name set TBLPROPERTIES('EXTERNAL'='true');

-- 删除分区元数据
alter table tbl_name drop if exists partition(dt < '20240713') purge;

-- 确认分区是否删除
show partitions tbl_name;

-- 转成内表
alter table tbl_name set TBLPROPERTIES('EXTERNAL'='false');

-- 确认是否转成内表
show partitions tbl_name;

-- 手动删除底层数据
ossutil rm -rf oss://base_path/aa/

六、hive日志

1. hive -e 不输出日志

hive -S -e "set hive.cli.print.header=flase; show partitions tab_name partition(dt>='20221201');" | sort | tail -1

2. 查看hive的日志

# 当前用户下查看hive的日志
/tmp/hive/用户名/hive.log
/tmp/hive/root/hive.log

九八、问题汇总

1. 删除分区过多

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. null

原因分析

drop partition的处理逻辑是将找到所有满足条件的分区,将其拼接起来,最后统一删除。由于分区数过多,拼删元数据堆栈较深,出现StackOverFlow异常。

解决办法

分批次删除分区。

2. 修复表分区失败

msck repair table tba_name;

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

表路径存在不规范的目录, 路径下存在文件, 或不符合分区的规范.

3. 删除表或分区报路径不存在错误

drop table tbl_name;
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:No such file or directory '')
alter table tbl_name drop partition(dt='xxx');
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. No such file or directory ''

解决方式

msck repair table tbl_name;
drop table tbl_name;

4. 多级分区内表删除分区, 删除缓慢且对oss产生大量get请求

问题原因: 多级分区内表删除分区时会对oss产生大量的get请求,目前已确认是开源hive 4.0以前版本的一个Feature(删除分区后会进一步查看父路径下是否为空,如果为空则进行删除,这在HDFS下没有问题,但在对象存储下会导致API调用次数暴涨), 可参考: [HIVE-22054] Avoid recursive listing to check if a directory is empty - ASF JIRA

解决方案: 把内表转成外表, 分别单独删除分区元数据和数据;

5. 先drop表再create table as报路径已存在

问题现象:
Error in query: Can not create the managed table('`db_name`.`tbl_name`'). The associated location('tbl_path') already exists.

问题原因:

该问题具有偶发性,未定位到原因怀疑是元数据压力大导致的误判;

6. 使用子查询时必须起别名

NoViableAltException(276@[96:1: atomjoinSource : ( tableSource ( lateralView ^)* | virtualTableSource ( lateralView ^)* | ( subQuerySource )=> subQuerySource ( lateralView ^)* | partitionedTableFunction ( lateralView ^)* | LPAREN ! joinSource RPAREN !);])

-- 运行报错
select * from (select 1 as id);


-- 运行OK的
select * from (select 1 as id) aa;

九九、hive优化

类别描述链接
Hive参数与性能企业级调优(建议收藏)


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一、关系运算: 4 1. 等值比较: = 4 2. 不等值比较: 4 3. 小于比较: < 4 4. 小于等于比较: 5 6. 大于等于比较: >= 5 7. 空值判断: IS NULL 5 8. 非空判断: IS NOT NULL 6 9. LIKE比较: LIKE 6 10. JAVA的LIKE操作: RLIKE 6 11. REGEXP操作: REGEXP 7 二、数学运算: 7 1. 加法操作: + 7 2. 减法操作: - 7 3. 乘法操作: * 8 4. 除法操作: / 8 5. 取余操作: % 8 6. 位与操作: & 9 7. 位或操作: | 9 8. 位异或操作: ^ 9 9.位取反操作: ~ 10 三、逻辑运算: 10 1. 逻辑与操作: AND 10 2. 逻辑或操作: OR 10 3. 逻辑非操作: NOT 10 四、数值计算 11 1. 取整函数: round 11 2. 指定精度取整函数: round 11 3. 向下取整函数: floor 11 4. 向上取整函数: ceil 12 5. 向上取整函数: ceiling 12 6. 取随机数函数: rand 12 7. 自然指数函数: exp 13 8. 以10为底对数函数: log10 13 9. 以2为底对数函数: log2 13 10. 对数函数: log 13 11. 幂运算函数: pow 14 12. 幂运算函数: power 14 13. 开平方函数: sqrt 14 14. 二进制函数: bin 14 15. 十六进制函数: hex 15 16. 反转十六进制函数: unhex 15 17. 进制转换函数: conv 15 18. 绝对值函数: abs 16 19. 正取余函数: pmod 16 20. 正弦函数: sin 16 21. 反正弦函数: asin 16 22. 余弦函数: cos 17 23. 反余弦函数: acos 17 24. positive函数: positive 17 25. negative函数: negative 17 五、日期函数 18 1. UNIX时间戳转日期函数: from_unixtime 18 2. 获取当前UNIX时间戳函数: unix_timestamp 18 3. 日期转UNIX时间戳函数: unix_timestamp 18 4. 指定格式日期转UNIX时间戳函数: unix_timestamp 18 5. 日期时间转日期函数: to_date 19 6. 日期转年函数: year 19 7. 日期转月函数: month 19 8. 日期转天函数: day 19 9. 日期转小时函数: hour 20 10. 日期转分钟函数: minute 20 11. 日期转秒函数: second 20 12. 日期转周函数: weekofyear 20 13. 日期比较函数: datediff 21 14. 日期增加函数: date_add 21 15. 日期减少函数: date_sub 21 六、条件函数 21 1. If函数: if 21 2. 非空查找函数: COALESCE 22 3. 条件判断函数:CASE 22 4. 条件判断函数:CASE 22 七、字符串函数 23 1. 字符串长度函数:length 23 2. 字符串反转函数:reverse 23 3. 字符串连接函数:concat 23 4. 带分隔符字符串连接函数:concat_ws 23 5. 字符串截取函数:substr,substring 24 6. 字符串截取函数:substr,substring 24 7. 字符串转大写函数:upper,ucase 24 8. 字符串转小写函数:lower,lcase 25 9. 去空格函数:trim 25 10. 左边去空格函数:ltrim 25 11. 右边去空格函数:rtrim 25 12. 正则表达式替换函数:regexp_replace 26 13. 正则表达式解析函数:regexp_extract 26 14. URL解析函数:parse_url 26 15. json解析函数:get_json_object 27 16. 空格字符串函数:space 27 17. 重复字符串函数:repeat 27 18. 首字符ascii函数:ascii 28 19. 左补足函数:lpad 28 20. 右补足函数:rpad 28 21. 分割字符串函数: split 28 22. 集合查找函数: find_in_set 29 八、集合统计函数 29 1. 个数统计函数: count 29 2. 总和统计函数: sum 29 3. 平均值统计函数: avg 30 4. 最小值统计函数: min 30 5. 最大值统计函数: max 30 6. 非空集合总体变量函数: var_pop 30 7. 非空集合样本变量函数: var_samp 31 8. 总体标准偏离函数: stddev_pop 31 9. 样本标准偏离函数: stddev_samp 31 10.中位数函数: percentile 31 11. 中位数函数: percentile 31 12. 近似中位数函数: percentile_approx 32 13. 近似中位数函数: percentile_approx 32 14. 直方图: histogram_numeric 32 九、复合类型构建操作 32 1. Map类型构建: map 32 2. Struct类型构建: struct 33 3. array类型构建: array 33 十、复杂类型访问操作 33 1. array类型访问: A[n] 33 2. map类型访问: M[key] 34 3. struct类型访问: S.x 34 十一、复杂类型长度统计函数 34 1. Map类型长度函数: size(Map) 34 2. array类型长度函数: size(Array) 34 3. 类型转换函数 35

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值