有時候會遇到j(luò)son格式的數(shù)據(jù)渐扮,一般這些數(shù)據(jù)分為兩種
第一種,解析完成后掖棉,直接得到了你想要的數(shù)值或類型墓律,這一類就可以直接用數(shù)據(jù)了。
第二種幔亥,解析完成后耻讽,數(shù)據(jù)被封裝在一起,用parse_json_object函數(shù)(解析json的函數(shù)帕棉,可能每個公司用的不一樣)沒辦法進一步解析针肥,那么這時候數(shù)據(jù)就沒辦法用了饼记。
針對第二種情況總結(jié)的方法,放在這里
首先看看幾個函數(shù)的用法:
regexp_replace
語法規(guī)則:
regexp_replace(1,2,3)
一般用3個參數(shù),有的時候可以用6個參數(shù)
第1個是輸入的字符串
第2個是正則表達式
第3個是替換的字符
split
語法規(guī)則:
split(1,2)
一般用2個參數(shù)
第1個是輸入的字符串
第2個是定位的字符
根據(jù)第二個字符將整個字符串切開慰枕,
比如這個
split({"水果":"0.09","發(fā)面主食":"0.16","肉類":"20.01","快餐":"0.09","營養(yǎng)品":"0.09"},",")
就是根據(jù)「,」將整個字符串切開
lateral view explode( ) adtable
含義:行轉(zhuǎn)列
括號中放入需要轉(zhuǎn)成列的字段
下面是一個實例具则,看完后就應(yīng)該都能理解了
例子:
解析到最后一步后,得到如下內(nèi)容
{"水果":"0.09","發(fā)面主食":"0.16","肉類":"20.01","快餐":"0.09","營養(yǎng)品":"0.09"}
最后我們希望得到這個結(jié)果:
按步驟演示代碼和結(jié)果:
第一步:
用正則表達式去掉「{}」一對大括號
代碼:
select regexp_replace(regexp_replace('{"水果":"0.09","發(fā)面主食":"0.16","肉類":"20.01","快餐":"0.09","營養(yǎng)品":"0.09"}','[\{|\}|\"|\"]',''),' ','')
運行結(jié)果:
第二步具帮,
用split函數(shù)切開博肋,用lateral view explode( ) adtable 將行轉(zhuǎn)成列
代碼:
select
split(regexp_replace(regexp_replace('{"水果":"0.09","發(fā)面主食":"0.16","肉類":"20.01","快餐":"0.09","營養(yǎng)品":"0.09"}','[\{|\}|\"|\"]',''),' ','')
,",") category_prefers
) t lateral view explode(t.category_prefers) adtable as category_prefers_1
運行結(jié)果:
第三步,
再用2次split函數(shù)將類型和數(shù)據(jù)分離
代碼:
select split(category_prefers_1,":") [0] as name,split(category_prefers_1,":") [1] as point
from
(select
category_prefers_1
from
(select
split(regexp_replace(regexp_replace('{"水果":"0.09","發(fā)面主食":"0.16","肉類":"20.01","快餐":"0.09","營養(yǎng)品":"0.09"}','[\{|\}|\"|\"]',''),' ','')
,",") category_prefers
) t lateral view explode(t.category_prefers) adtable as category_prefers_1
) t
運行結(jié)果:
話說有沒有更簡單的辦法蜂厅,這種搞法實在太復(fù)雜了匪凡,如果有更簡單的方法,歡迎留言掘猿,??