tft每日頭條

 > 科技

 > hive格式轉換函數

hive格式轉換函數

科技 更新时间:2024-08-30 09:24:05

在大數據開發過程中我們常常會處理一些客戶端日志,服務端的用戶行為日志等等,這些日志通常都是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,并拿該函數作為樣例。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved