Hive(六)JSON函式

一年都在冬眠發表於2024-10-09

概念

什麼是JSON

  • JSON(JavaScript Object Notation)是一種輕量級的資料交換格式,易於人閱讀和編寫,同時也易於機器解析和生成
  • JSON是儲存和交換文字資訊的語法,類似XML
  • JSON比XML更小、更快,更易解析

JSON語法

  • 資料在名稱/值對中
  • 資料由,分開
  • 使用斜槓\來跳脫字元
  • 大括號{}儲存物件
  • 中括號[]儲存陣列,陣列可以包含多個物件

結構

  • 物件:大括號儲存的物件是一個無序的名稱/值對集合,一個物件以左括號開始,右括號結束,每個鍵後跟一個冒號,名稱/值對使用逗號分隔
  • 陣列:中括號[]儲存的陣列是值(value)的有序集合,一個陣列以左中括號開始,右中括號結束,值之間使用逗號分隔

JSON函式

函式 說明 示例
get_json_object(json_string, ‘$.key’) 用於提取JSON字串中的特定欄位 獲取json字串中的name欄位,get_json_object('{"name":"John","age":30}', '$.name')
json_tuple(json_string, k1, k2 …) 可以在一次函式呼叫中提取多個欄位 獲取json字串中的name,age欄位,get_json_object('{"name":"John","age":30}', 'name', 'age')

explode函式

  • 語法:explode(Array OR Map)
  • 說明:接收一個array或者map型別的資料作為輸入,然後將array或map裡面的元素按照每行的形式輸出,也被稱為列轉行函式,通常與LATERAL VIEW一起使用,用於將一個陣列或巢狀的JSON陣列展開成多行
  • 例項:包含JSON陣列的表users
{
  "name": "John Doe",
  "interests": ["Reading", "Hiking", "Cooking"]
}
{
  "name": "Jane Smith",
  "interests": ["Running", "Swimming"]
}

展開interests陣列,並將每個興趣愛好作為單獨的行

SELECT name, interest
FROM users
LATERAL VIEW explode(interests) t AS interest;
  • LATERAL VIEW: 這個關鍵字用於將explode函式的結果與原始表users進行連線,以便每行的interests陣列展開成多行
  • explode(interests): 這個函式將interests陣列展開,每個元素成為一行
  • t AS interest: 這是LATERAL VIEW的別名定義,t是一個臨時表,interest是展開後的列名
name        | interest
------------+---------
John Doe    | Reading
John Doe    | Hiking
John Doe    | Cooking
Jane Smith  | Running
Jane Smith  | Swimming

regexp_replace函式

  • 語法:regexp_replace(string A, string B, string C)
  • 說明:將字串A中的符合java正規表示式B的部分替換為C,注意,在有些情況下要使用跳脫字元,類似oracle中的regexp_replace函式
--將,替換為;
select regexp_replace('{"user_name":"chimchim","age":30,"sex":"woman"}', ',', ';');

JsonSerDe

  • 從Hive 3.0.0開始,Hive內建了JsonSerDe,可以直接處理JSON檔案,無需手動解析每個欄位,在建立表時指定JsonSerDe序列化器,並在HDFS上存放JSON檔案,就可以直接查詢欄位內容
create table tb_json_test2 (
	device string,
	deviceType string,
	signal double,
	time string
)
row format serde 'org.apache.hive.hcatalog.data.JsonSerDe'
stored as textfile;

load data local inpath '/root/hivedata/device.json' into table tb_json_test2;

select * from tb_json_test2;

相關文章