首页
/
每日頭條
/
科技
/
hive格式轉換函數
hive格式轉換函數
更新时间:2025-12-17 22:56:25

在大數據開發過程中我們常常會處理一些客戶端日志,服務端的用戶行為日志等等,這些日志通常都是JSON格式的,要對這些日志進行研究就需要用Hive把它們做成關系型表,Hive官方為我們提供了兩個函數用于處理JSON格式數據。

  • get_json_object(STRING json_string, STRING path)

該函數從給定路徑上的JSON字符串中抽取出JSON對象,并返回這個對象的JSON字符串形式,如果輸入的JSON字符串非法,則返回NULL

  • json_tuple(STRING jsonStr, p1, p2, p3 .., pn)

該函數可以接受多個标簽名稱,對輸入的JSON字符串進行處理(UDTF),相比get_json_object更加高效,通過一次調用就可以獲得多個鍵值。json_tuple函數通常要和lateral view連用,用于将一行數據拆分成多行。

下面我們通過真實場景來看下兩個函數的使用方法和區别

源表定義和初始化

如下所示為一個遊戲對局結果的log樣本

2021-05-29 GameResult {"players":[{"player_id":43455341,"rank":2},{"player_id":15278345,"rank":1},{"player_id":2689332,"rank":3}],"game_id":"111129320310391","timestamp":1622254656,"start_time":1622251256} 2021-05-29 GameResult {"players":[{"player_id":43455342,"rank":1},{"player_id":15278342,"rank":2},{"player_id":2689332,"rank":3}],"game_id":"111129320310392","timestamp":1622255656,"start_time":1622254256} 2021-05-29 GameResult {"players":[{"player_id":43455343,"rank":2},{"player_id":15278343,"rank":1}],"game_id":"111129320310393","timestamp":1622258656}

我們定義一張Hive表,并将樣本數據寫入到Hive表

CREATE TABLE stark.game_result_test ( logdate DATE, logtype STRING, content STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; # 加載數據 load data local inpath '/home/bi/xxx/gameresult_sample.txt' into table stark.game_result_test;

查看是否導入成功

hive格式轉換函數(如何優雅的用Hive處理json格式字符串)1

然後我們分别用兩個函數處理content字段

get_json_object函數

SQL如下

hive> SELECT t.logdate,t.logtype, > get_json_object(t.content,'$.players') AS players, > get_json_object(t.content,'$.game_id') AS game_id, > get_json_object(t.content,'$.timestamp') AS timestamp, > get_json_object(t.content,'$.start_time') AS start_time > FROM ( > SELECT logdate,logtype,content > FROM stark.game_result_test > ) t;

結果如下

hive格式轉換函數(如何優雅的用Hive處理json格式字符串)2

通過該函數輕松完成了content字段的解析,但是不難發現每個字段的提取都要通過調用該函數處理json字符串完成,當json字符串中字段很多時會嚴重影響處理的效率。

json_tuple函數

同樣是針對該表content字段的處理,使用json_tuple函數SQL語句如下

SELECT t.logdate,t.logtype,players,game_id,timestamp,start_time FROM stark.game_result_test t lateral view json_tuple(t.content,'players','game_id','timestamp','start_time') a AS players,game_id,timestamp,start_time;

由于get_tuple是UDTF函數(一個輸入多個輸出),所以要和lateral view 連用把一個字段拆分成多個字段。lateral view 得到的視圖要起一個别名(本例為a)。

最終查詢結果和get_json_object函數一緻。

最後

目前為止,看起來這兩個函數能夠滿足我們的基本需求,不過細心的讀者會發現通過兩個函數提取出來的players字段我們一直沒有進一步拆分(當我們要對每個玩家的對局結果處理時是需要拆分出每個玩家的)。

players字段是一個json數組,這兩個函數顯然都無法處理,這就需要我們自定義一個UDF函數來進行處理,後續章節我會帶領大家了解一下hive的自定義UDF,并拿該函數作為樣例。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
微信文件大小限制解除
微信文件大小限制解除
微信文件大小限制解除?在使用微信的時候如果文件超過了系統設定的大小就無法發送,需要通過壓縮、郵箱或者是其他第三方網絡平台進行分享傳送才能實現,現在小編就來說說關于微信文件大小限制解除?下面内容希望能幫助到你,我們來一起看看吧!微信文件大小限...
2025-12-17
蘋果手機什麼快捷指令比較好用
蘋果手機什麼快捷指令比較好用
對于蘋果手機來說,你平時應該看到過快捷指令中心這個功能。但是,這個App雖然可以很強大,但學習成本确實有點高,很多人沒怎麼用。不過最近發現在快捷指令中心裡面,增加了很多官方提供的常用快捷指令,可以滿足很多小需求,降低了一些使用的門檻。你用過...
2025-12-17
電腦系統還原操作
電腦系統還原操作
系統在使用一段時間之後,都會因為一些大大小小的原因導緻系統出現一些問題,這時候很多人就想到了一鍵還原系統,那麼電腦怎麼一鍵還原系統呢?有不少的用戶存在疑問,下面,小編給大家介紹電腦還原系統的操作流程。一些用戶在使用筆記本電腦的時候,可能會碰...
2025-12-17
山東糧滿倉生物科技有限公司
山東糧滿倉生物科技有限公司
山東糧滿倉生物科技有限公司?來源:人民日報振興種業、創新科技,推進農業專業化生産、規模化經營、現代化服務——成都科技興農糧滿倉,下面我們就來說一說關于山東糧滿倉生物科技有限公司?我們一起去了解并探讨一下這個問題吧!山東糧滿倉生物科技有限公司...
2025-12-17
蘋果手機5g信号經常斷
蘋果手機5g信号經常斷
這裡有Apple果粉,也有為發燒而生的小米鐵粉,有支持世界五百強的華為,有為了羅永浩而買的錘子。有些人說蘋果手機好用,所以連夜排隊買iPhone,有些人說支持國産品牌,所以一直都買的是華為,而有些人還說,買錘子手機全是為了信仰,現在這個時代...
2025-12-17
Copyright 2023-2025 - www.tftnews.com All Rights Reserved