【hive】解析JSON格式字符串

莫聽穿林打葉聲|何妨吟嘯且徐行

【hive】解析JSON格式字符串


以下是本期內容:

hive中解析簡單JSON字符串,以及解析比較複雜的嵌套JSON格式的字符串


本文大綱:

<code>01.get_json_object解析json中的單個屬性
02.json_tuple解析json中的多個屬性
03.解析多層嵌套Json/<code>


正文

  • 01 解析json中的單個屬性
<code>select get_json_object(user_log,'$.source_id') 
from user_log_list/<code>

使用$表示json變量,然後用 . 讀取對象;

使用get_json_object()的時候一次只能解析json對象裡的一個字段。

  • 02 解析json中的多個屬性
<code>select json_tuple(user_log,'source_id','properties','events') 
from user_log_list/<code>
  • 03 解析多層嵌套Json

單條JSON日誌user_log的格式如下:

<code>{
"source_id":1000,
"properties":{
"user_id":"10245784",
"device_id":"1001245"
},
"events":[
{
"event_id":2,
"event_data":{
"mode":6,
"intro":"想要的都在這裡,一鍵滿足需求"
}
},
{
"event_id":4,
"event_data":{
"mode":6,
"intro":"7X24小時為您服務是我們的宗旨"
}
}
]
}/<code>

1、LATERAL VIEW

我們通過多次使用Lateral view 語句解析多層嵌套的json,“lateral view”表示“橫向視圖”,“lateral”作為動詞時表示“橫向傳球”。

我們看下面這張json解析邏輯圖可以看出,解析完一層後,把解析出來的字段添加至原有視圖的右側(此處的邏輯類似於select * from 原有視圖 left outer join 新解析出來的字段,通過這種方式把一行數據拆分成多行),繼續解析下一層,以此類推。

【hive】解析JSON格式字符串

<code>SELECT user_log,a.source_id,a.properties,a.events FROM user_log_list
LATERAL VIEW json_tuple(user_log,'source_id','properties','events') a AS source_id,properties,events
--視圖別名為a,生成新列的別名為source_id,properties,events/<code>

注意:在使用lateral view的時候必須指定視圖別名和生成新列的別名

2、LATERAL VIEW explode

events並不是map(字典)格式,而是數組,無法通過json_tuple方法進行解析,所以我們用explode方法來解析數組。

【hive】解析JSON格式字符串

<code>SELECT user_log,a.source_id,b.user_id,b.device_id,d.event_id,d.event_data FROM user_log_list
LATERAL VIEW json_tuple(user_log,'source_id','properties','events') a AS source_id,properties,events
LATERAL VIEW explode(split(regexp_replace(regexp_extract(b.events,'^\\\\[(.+)\\\\]$',1),'\\\\}\\\\,\\\\{', '\\\\}\\\\|\\\\|\\\\{'),'\\\\|\\\\|')) c AS list/<code>

解釋:

<code>regexp_extract(b.events,'^\\[(.+)\\]$',1)/<code>

其中正則表達式'^\\[(.+)\\]$'代表的是在b.events中匹配出以"["開頭且以"]"結尾的中間的所有字符,index指定為1表示返回正則表達式中第一個() 對應的結果。

<code>regexp_replace(regexp_extract(b.events,'^\\[(.+)\\]$',1),'\\}\\,\\{', '\\}\\|\\|\\{')/<code>

將數組中分隔各元素的逗號,替換成雙豎槓。

<code>split(regexp_replace(regexp_extract(b.events,'^\\[(.+)\\]$',1),'\\}\\,\\{', '\\}\\|\\|\\{'),'\\|\\|')/<code>

表示以雙豎槓分割字符串,返回結果為一個數組。

<code>LATERAL VIEW explode(split(regexp_replace(regexp_extract(b.events,'^\\[(.+)\\]$',1),'\\}\\,\\{', '\\}\\|\\|\\{'),'\\|\\|'))/<code>

用explode解析該數組,結合LATERAL VIEW生成新的橫向視圖。

⑤上述表達式中的雙反斜槓\\\\為hive裡的轉義字符。

【hive】解析JSON格式字符串


點擊瞭解更多。。。


分享到:


相關文章: