概念
什麼是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;