在使用Hive搭建數據倉庫,處理數據時敌买,同傳統(tǒng)數倉的結構化數據不同藤乙,我們經常會遇到一些非結構化的數據猜揪,json格式的字符串就是常見的一種類型惭墓。
對于簡單的json字符串坛梁,Hive提供了get_json_object函數用來提取字符串中的相應信息,但如果遇到如下樣式的json字符串數組
[{"disttype":"直線","placeid":'abcdef',"place":"距景點A直線xxx米 · xx山風景區(qū)外","motivateinfo":"","labels":"游玩|休閑|"},
{"disttype":"直線","placeid":'hijklmn',"place":"距景點A直線xxy米 · xx山風景區(qū)外","motivateinfo":"","labels":"低價|親子|"}]
此時就需要explode函數來處理這種情況腊凶;
下面先上代碼划咐,然后再分步講解:
select m.d,j.info,get_json_object(j.info,'$.placeid') hotelid,
get_json_object(j.info,'$.labels') tag
from (select d,split(regexp_replace(regexp_extract(
'[{"disttype":"直線","placeid":'abcdef',"place":"距景點A直線xxx米 · xx山風景區(qū)外","motivateinfo":"","labels":"游玩|休閑|"},
{"disttype":"直線","placeid":'hijklmn',"place":"距景點A直線xxy米 · xx山風景區(qū)外","motivateinfo":"","labels":"低價|親子|"}]',
'\\}\\,\\{','\\}\\|\\|\\{'),
'\\|\\|') info_array
from table) m
lateral view explode(info_array) j as info;
說明:
- explode函數要求參數必須是array或者map類型拴念,所以需要先把字符串轉成array
- regexp_extract('xxx','^\[(.+)\]$',1) 這里是把需要解析的json數組去除左右中括號,需要注意的是這里的中括號需要兩個轉義字符\[褐缠。
- regexp_replace('xxx','\}\,\{', '\}\|\|\{') 把json數組的逗號分隔符變成兩根豎線||政鼠,可以自定義分隔符只要不在json數組項出現就可以。
- 使用split函數返回的數組队魏,分隔符為上面定義好的公般。
- lateral view explode處理3中返回的數組
- 然后就可以使用get_json_object或者json_tuple來一條條處理json數據了