1.hive查询中sum数据精度丢失问题
公司大数据组把线上数据库表的类型简单粗暴的设置为string类型了,而我们在hive上做算数运算时出现精度丢失现象。
处理方案:使用cast(table.column_name as decimal(38,2)) 将string类型转换成decimal(38,2)为保留两位小数。
2.hive正则表达式regexp_extract
下面这个链接比价详细了
https://blog.csdn.net/jv_rookie/article/details/55211955
我再根据我的数据举一个实例:
如字段exts={id=11,name=xunying,type=1,flag=0}
我们要截取id字段:
regexp_extract(exts,'id([^,]+),',1)
返回结果:11
3.hive 取json格式的属性值
单个值:
json object:
Select get_json_object(attrs, '$.d') as attr_d,
{"id":"0","name":"13","d":"","age":"13","weight":"32.3","high":"32.3"}
jsonArray(json数组):
Select get_json_object(xjson,"$.[0].age") --获取数组第1个条记录 (测试下这个:get_json_object(xjson,'$[0].age'))
[{"id":"0","name":"13","d":"","age":"13","weight":"32.3","high":"32.3"},{"id":"1","name":"13","d":"","age":"13","weight":"32.3","high":"32.3"}]
3-1 hive中表结构为Map类型
表中数据类型:map<string,string>
数据样例:{"id":"0","name":"13","d":"","age":"13","weight":"32.3","high":"32.3"}
解析:select attrs['name'] from
3-2 hive中表结构为String类型
表中数据类型:string
数据样例:{"id":"0","name":"13","d":"","age":"13","weight":"32.3","high":"32.3"}
解析:(解析多个字段)
select a*,b.id,b.name from table1 a lateral view json_tuple(a.attrs,'id','name') b as id,name
或者正则方法
3-3 hive中表结构为Struct类型
表中数据类型:struct<id:string,weight:double>
数据样例:{"id":"0","weight":"32.3"}
解析:select attrs.weight from
4.hive选取一些连续的某些字段
LAG:
LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值
第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)
LEAD:
与LAG相反
LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值
第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)
FIRST_VALUE
取分组内排序后,截止到当前行,第一个值
LAST_VALUE
取分组内排序后,截止到当前行,最后一个值(和lead有区别)
5.正则匹配REGEXP_REPLACE
REGEXP_REPLACE(source_string, pattern[, replace_string [, position[,occurrence, [match_parameter]]]])
eg:REGEXP_REPLACE('ksjdhk23ekfdskj4334','[^a-z]' ,'') -------ksjdhkekfdskj 只保留字符
REGEXP_REPLACE('ksjdhk23ekfdskj4334','[^0-9]' ,'') ----------234334 只保留数字
regexp_replace('湖北省, 阳新县, 东方明珠',' | |`|\||','')
6.trunc()函数用法处理日期、数字类型数据
一、日期
TRUNC函数为指定元素而截去的日期值。
其具体的语法格式如下:
TRUNC(date[,fmt])
其中:date 一个日期值
fmt 日期格式,该日期将由指定的元素格式所截去。忽略它则由最近的日期截去
二、数字
TRUNC(number,num_digits)
Number 需要截尾取整的数字。
Num_digits 用于指定取整精度的数字。Num_digits 的默认值为 0。
TRUNC()函数截取时不进行四舍五入
7 Array类型数据
访问arr[index]
行转多列:select table1 .B from table1 a1 LATERAL VIEW explode(service_prod_code) table1 as B