數(shù)倉json字段提取通用方案
統(tǒng)一方案
普通Json字符串可直接使用 方法1 或 方法2 ?get_json_object 或 json_tuple
Json數(shù)組直接使用udf函數(shù),杜絕使用 方法3,目前數(shù)倉中多數(shù)是方法3,建議統(tǒng)一整改,消除隱患
背景
數(shù)據(jù)倉庫目前的數(shù)據(jù)主要源于業(yè)務(wù)系統(tǒng),數(shù)據(jù)結(jié)構(gòu)內(nèi)容繁雜,在做數(shù)據(jù)清洗時(shí),常常會(huì)需要解析提取字符串類型的json數(shù)據(jù),不同的人有不同的處理方法,雖然有些方法看起來能解決當(dāng)前的需求,但卻存在隱患,下面會(huì)給出具體的場景說明為什么,因此就需要一個(gè)通用的方案來解析這些Json,消除隱患,提升數(shù)據(jù)質(zhì)量。
hive內(nèi)置函數(shù)
1.get_json_object(string json_string, string path)
返回值:json字符串中的1個(gè)數(shù)據(jù)項(xiàng)
說明:解析json的字符串json_string,返回path指定的內(nèi)容。如果輸入的json字符串無效,那么返回NUll,這個(gè)函數(shù)每次只能返回一個(gè)數(shù)據(jù)項(xiàng)

select get_json_object(jsonstr, '$.website') as website from?tmp;

返回值:json字符串中的多個(gè)數(shù)據(jù)項(xiàng)
說明:解析json的字符串json_string,返回k1,k2,...,kn指定的內(nèi)容。如果輸入的json字符串無效,那么返回NUll,這個(gè)函數(shù)每次能返回多個(gè)數(shù)據(jù)項(xiàng),需配合 LATERAL VIEW 一起使用
select
????b.website
????, b.name
from?
????tmp?a
lateral view
json_tuple(a.jsonstr,'website','name') b as website,name
where XXX?
注意1??
json_tuple相較于get_json_object的優(yōu)勢就是一次可以解析多個(gè)Json字段。但是如果我們有個(gè)Json數(shù)組,這兩個(gè)函數(shù)都無法處理
udf函數(shù)提取Json數(shù)組
歸根結(jié)底,我們想要在hive中提取Json數(shù)組中的數(shù)據(jù),首先得讓它是個(gè)數(shù)組,而非字符串,那么想要通過hive內(nèi)置函數(shù)將 String 類型的Json數(shù)組轉(zhuǎn)成數(shù)組類型,就要用到分割符分割的方式去實(shí)現(xiàn)(目前好像也只能這么干),只要用到分割符,就會(huì)存在隱患
通過java程序,可規(guī)避使用分割符分割字符串?dāng)?shù)組的目的
/*
這是自定義函數(shù),可將一個(gè)string類型的json數(shù)組,轉(zhuǎn)成hive可接受的json數(shù)組
*/