1.substr()函数
substr()是字符串截取函数,其语法为: substr(string A, int start, int len),返回值为 string类型。说明:返回字符串A从start位置开始,长度为len的字符串。这里需要注意的是初始位置是从1开始。
2.explode()函数–行转列
explode函数可以将一个array或者map展开,其中explode(array)使得结果中将array列表里的每个元素生成一行;explode(map)使得结果中将map里的每一对元素作为一行,key为一列,value为一列,一般情况下,直接使用即可。
new_col_1
, new_col_2
使用lateral view+explode后每一个id与炸裂出来的每一行进行笛卡尔积关联(即一列转多行).
还有一种情况,当UDTF所转化的array是空的时候如何处理呢?
在hive 0.12当中支持outer关键字,如果UDTF结果为空,默认会被忽略输出。如果加上outer关键字则会像left outer join一样,还是会输出select出的列,UDTF的输出结果是NULL
3.collect_set()函数–列转行 将一列中的多行去重后合并成一行
collect_set(col)函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。例如,要统计每种no下的score,直接对no分组后对score进行collect_set操作。
4.collect_list()函数–列转行 将一列中的多行合并成一行
5.concat_ws()函数–实现指定连接的作用
concat_ws(‘,’ , collect_set(infodisptype)),将聚合的数据之间使用,做分割形成array。S
特殊用法:用于判断聚合后的array中是否包含有期望的值
array_contains(split(concat_ws(‘,’ , collect_set(infodisptype)),‘,’),‘shuaxin’)
6.获取jsonarray中的value
例:select json_tuple(aa.col,‘website’) from (select (
split(
regexp_replace(
regexp_replace(‘[{“website”:“www.baidu.com”,“name”:“百度”},{“website”:“google.com”,“name”:“谷歌”}]’, ‘\[|\]’,‘’),
‘\}\,\{’,‘\}\|\{’)
,‘\|’)[0]
)as col )as aa
7.使用正则表达式截取特定范围字符串
select
regexp_extract(infojson,‘“w”:“([^”]+)"’,1)
from hdp_lbg_supin_zplisting.t_ods_zp_recsearch
where dt = ‘${dateSuffix}’ limit 1000
解析:参数1是传入的字段,参数二是正则‘()’内的才是真正要匹配出来的,参数3传入的数值是用于限定取得范围,
0是显示与之匹配的整个字符串
1 是显示第一个括号里面的
2 是显示第二个括号里面的字段…
8.一些hive相关的命令与参数
hadoop fs -du -s -h
hive外部表删除,数据还是存在hdfs上没有被删除的,只需要重建一下table,如果是分区表需要使用下面的命令修复就可以了
MSCK REPAIR TABLE table_name
hive 内部表被删除数据也一起被删除了。
所以只有自己用的临时表才可以创建为内部表,生产环境下的表都创建为 external table。
如果开启了回收站数据是可以找回的,需要在hdfs上的回收站里mv回到原路径然后重新创建表结构,如果是分区表需要加命令 MSCK REPAIR TABLE teat_table修复。
1.关于if条件判断里的null,如果第一个判断条件是null的长度,不论判断条件如何写最终结果都是要运行if的第三个参数。
SELECT if(length(null)>4,1,‘-’); – ‘-’
SELECT if(length(null)<4,1,‘-’)-- ‘-’
2.nvl(tjfrom,‘-’)函数作用是在参数1为null时替换成参数2;
3.null在正则表达式中的使用。select null rlike ‘^\d+$’;–结果永远为null;
4.关于日期格式你必须知道的坑( yyyy-MM-dd HH:mm:ss),码着提醒自己
yyyy-MM-dd HH:mm:ss:代表将时间转换为24小时制,例: 2018-06-27 15:24:21
yyyy-MM-dd hh:mm:ss:代表将时间转换为12小时制,例: 2018-06-27 03:24:21
将日期时间转化为时间戳(10位):unix_timestamp(substring(refresh_time,0,19), ‘yyyy-MM-dd HH:mm:ss’)
将时间戳转化为小时数(24小时):from_unixtime(cast(logtime/1000 as bigint),‘HH’) as `hours`
5.关于``
6.concat_ws和collect_set()函数联合使用–对某列的多行进行去重合并
select subtype
,concat_ws(‘&’,collect_set(cast(from as string))) from
,concat_ws(‘&’,collect_set(cast(id as string))) id
,concat_ws(‘&’,collect_set(cast(name as string)))name
,concat_ws(‘&’,collect_set(cast(type as string))) type
from aaaaaaa
group by subtype;
7.concat_ws和collect_list()函数联合使用–对某列不进行去重合并
select subtype
,concat_ws(‘&’,collect_list(cast(from as string))) from
,concat_ws(‘&’,collect_list(cast(id as string))) id
,concat_ws(‘&’,collect_list(cast(name as string)))name
,concat_ws(‘&’,collect_list(cast(type as string))) type
from aaaaaaa
group by subtype;
8.hive中使用正则匹配时候如需转义需要使用\双斜杠
如果要匹配的字符里有“;”那么需要使用“;”的ascii码对应的八进制数字代替。否则遇“;”就结束了。
9.hive中and和or连用时 and优先级高于or,需要在外层添加()来改变执行顺序。
10.分区表新增一个字段,再插入数据会显示该字段为null,其实数据已经插入但是hive无法显示,解决办法如下:
(1)cascade 关键字
alter table hdp_lbg_supin_zplisting.ods_zp_actual_infodetail partition(dt=20200728) add columns(source string) CASCADE;
(2)先drop掉表然后重新创建,再msck一下
msck repair table hdp_lbg_supin_zplisting.ods_zp_actual_infodetail;
(3)也可以这样做
alter table tablename add columns(source string)
然后正常写数据进去,然后执行如下操作,先删除分区再msck
alter table partition_test drop partition(dt=‘a’);
msck repair table partition_test
11.coalesce(a,b) 如果a为 null返回b,如果ab都为null返回null
12、打散操作
Hive SQL 查询结果导出到本地:
第一步导出到文件夹
方式1:导出到本地,文件格式为lzo
首先在本地mkdir创建文件夹,然后执行以下操作,会在文件夹下生成.Lzo文件
insert overwrite local directory “/home/hdp_lbg_supin/wanglizhou/output/”
select * from hdp_lbg_supin_zplisting.dim_zp_bi_indicator;
方式2:导出到本地,指定分割符”\t”
insert overwrite local directory “/home/hdp_lbg_supin/wanglizhou/output”
row format delimited fields terminated by “\t”
select * from hdp_lbg_supin_zplisting.dim_zp_bi_indicator;
方式3:直接在系统目录执行
(1)sql语句放在一个叫做file.sql的文件中
hive -f file.sql > /home/hdp_lbg_supin/wanglizhou/output/test.txt
(2)sql语句放在字符串中 hive -e “sql ” > /home/hdp_lbg_supin/wanglizhou/output/test.txt
第二步:文件导出到本地 sz + 文件名 如”sz /000000_0_0.lzo”
如果是lzo需要先解压
Lzo解压命令:解压文件 lzop -dv + 文件全路径
lzop -dv /home/hdp_lbg_supin/wanglizhou/output/000000_0_0.lzo
hadoop文件系统复制到本地需要使用copyToLocal命令,
grep ‘xxx’ 目标文件名 -A 20 匹配查找到的及以后的20行内容