hive小tips(各种解析)

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

原文地址:https://www.cnblogs.com/xunyingFree/p/9541947.html