Hive是大数据生态圈的数据仓库工具。通过hive,我们可以方便地进行ETL的工作。我们之前的文章已经介绍过一些hive sql的基本操作以及具体的实例代码演示,今天我们介绍另一个场景应用,就是在hive中解析json嵌套。
一般情况下,存储json文本格式的工具是MongoDB这些nosql db, 而hive和MongoDB是可以相互做数据的传输同步的,假设从MongoDB中把数据同步到hive中,我们在hive里对数据做解析,取值的基本操作如下。
1、存入方式
MongoDB的文档数据存入hive时,尽可能把整个文档存入到一个hive表字段中(如果有业务限定或者有特定场景需要把个别字段单独提取出来除外)。
2、json示例

{
"bedroom": {
"min_value": 2,
"max_value": 3,
"tags": [
{
"id": 2,
"name": "2居室",
"score": 0.00055233
},
{
"id": 3,
"name": "3居室",
"score": 0.00055233
}
]
},
"build_type": [
{
"id": 1,
"name": "板楼",
"score": 0.00055233
}
],
"user_level": 1,
"user_type": 2
}
这个json数据中有不同的类型的json嵌套,这一个document我们会整体存入hive的一个字段中,比如字段名我们叫做 content;而我们在hive中对json数据做解析一般会用到两个函数,分别是get_json_object和json_tuple, 这两个函数都是对json字段做解析,区别是json_tuple是可以一次提取多个json中的字段,而 get_json_object 只能提取一个字段。
直接提取普通字段或者不做深层解析
select
get_json_object(content, '$.user_level') as level
from document
对list格式的嵌套json做解析
select pp.col,r.name, r.score
from (
select split(regexp_replace(regexp_extract(content,
'^\\[(.+)\\]$',1),
'\\}\\,\\{', '\\}\\|\\|\\{'),
'\\|\\|'
) as cont
from document) ss
lateral view explode(ss.cont) pp as col
lateral view json_tuple(ss.cont,'name','score') r as name,score;