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('湖北省, 陽新縣, 東方明珠','\n|\r|`|\\||','')
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