前言
Hive是一個基于Hadoop的數(shù)據(jù)倉庫基礎(chǔ)設(shè)施,用于處理大規(guī)模分布式數(shù)據(jù)集。它提供了一個類似于SQL的查詢語言(稱為HiveQL),允許用戶以類似于關(guān)系型數(shù)據(jù)庫的方式查詢和分析存儲在Hadoop集群中的數(shù)據(jù)。
Hive常作為離線數(shù)倉的分析工具,當(dāng)面臨Json數(shù)據(jù)時,Hive需要用到其數(shù)據(jù)結(jié)構(gòu)構(gòu)建出一張Json表才得以操作Json數(shù)據(jù);(Hive4.0推出了Json解析)
一、array數(shù)組類型
數(shù)組是一組具有相同類型的變量的集合。 這些變量稱為數(shù)組的元素,每個數(shù)組元素都有一個編號,編號從零開始。
數(shù)組類型的創(chuàng)建:
drop table if exists test_datatype;
create external table test_datatype(
ids array<int>,
) comment '數(shù)據(jù)結(jié)構(gòu)測試表'
location 'test/test_datatype';
創(chuàng)建表字段時,使用Array類型需要聲明其泛型,如果在后續(xù)的操作中,向該表字段插入了一個包含string類型的array,Hive 在數(shù)據(jù)加載過程中會根據(jù)目標(biāo)表的聲明進(jìn)行數(shù)據(jù)類型推斷和轉(zhuǎn)換。如果插入的數(shù)組元素與目標(biāo)表聲明的數(shù)據(jù)類型不匹配,Hive 會嘗試進(jìn)行隱式類型轉(zhuǎn)換。在這種情況下,Hive 會嘗試將字符串轉(zhuǎn)換為整數(shù)類型。
Tip:隱式類型轉(zhuǎn)換可能導(dǎo)致數(shù)據(jù)丟失或錯誤。如果類型轉(zhuǎn)換失敗Hive 可能會將其轉(zhuǎn)換為 NULL 值。
以下構(gòu)建一個簡單的array數(shù)組對象:
====查詢語句====
select
ids,
`array`(ids[0],ids[6]),
array_contains(ids,'milet')
from (
select `array`("aimyon","aimer","vaundy","Ado",1,3.6) as ids
)t1
====執(zhí)行結(jié)果====
ids>>>["aimyon","aimer","vaundy","Ado","1","3.6"]
`array`(ids[0],ids[5])>>>["aimyon",null]
array_contains(ids,'milet')>>> false
- Array 類型可以存儲具有相同數(shù)據(jù)類型的元素。這意味著數(shù)組中的每個元素都應(yīng)該是相同的數(shù)據(jù)類型。上述的Hql中使用了string和int類型,但是查詢結(jié)果顯示的都是string類型。
- Array類型通過下標(biāo)取出元素,如果下標(biāo)越界,取出的元素為null
- array_contains()能夠檢索數(shù)組是否包含該元素,該函數(shù)返回布爾類型。
二、map鍵值對集合類型
Map 類型是一種鍵值對的集合,其中的鍵和值可以是任何 Hive 支持的數(shù)據(jù)類型。Map 類型用于表示一種關(guān)聯(lián)關(guān)系,類似于其他編程語言中的字典或哈希表。
Map類型的創(chuàng)建:
drop table if exists test_datatype;
create external table test_datatype(
dat map<string,string>
) comment '數(shù)據(jù)結(jié)構(gòu)測試表'
location 'test/test_datatype';
創(chuàng)建Map類型時,需要聲明其鍵值對泛型,Map 類型的語法為 MAP<key_type, value_type>,其中 key_type 和 value_type 分別表示鍵和值的數(shù)據(jù)類型。
以下構(gòu)建一個簡單的map對象:
====查詢語句====
select
dat,
dat['a'],
map_keys(dat),
`if`(array_contains(map_keys(dat),"a"),"true","false")
from (
select `map`('a','b',1,'d') dat
)t;
====執(zhí)行結(jié)果====
dat>>>{"a":"b","1":"d"}
dat['a']>>>b
map_keys(dat)>>>["a","1"]
`if`(array_contains(map_keys(dat),"a"),"true","false")>>>true
map類型使用map[‘key_name’]的方式取出值,并且hive提供了map_keys,map_values獲取所用的key和value,這在一些判斷場景下非常好使。
Tip:map的key的類型可以不統(tǒng)一,但是value類型必須統(tǒng)一。
三、struct結(jié)構(gòu)體類型
在 Hive 中,結(jié)構(gòu)體(Struct)類型是一種用于組合多個字段的復(fù)合數(shù)據(jù)類型。結(jié)構(gòu)體類型允許你在一個列中存儲多個相關(guān)的值,并將它們作為一個單元進(jìn)行處理。
結(jié)構(gòu)體類型由多個字段組成,每個字段都有一個名稱和一個數(shù)據(jù)類型。你可以將結(jié)構(gòu)體類型用作表的列類型,或者作為其他復(fù)合數(shù)據(jù)類型(如數(shù)組或映射)的元素類型。
struct類型的創(chuàng)建:
drop table if exists test_datatype;
create external table test_datatype(
obj struct<id:int,name:string>
) comment '數(shù)據(jù)結(jié)構(gòu)測試表'
location 'test/test_datatype';
創(chuàng)建struct結(jié)構(gòu)體時,需要聲明所有使用到的類型,結(jié)構(gòu)體創(chuàng)建之后,其屬性不能再做更改。
以下構(gòu)建一個簡單的struct對象:
====查詢語句====
select struct('a','b','c','d') >>>{"col1":"a","col2":"b","col3":"c"}
select name_struct('a','b','c',1) >>>{"a":"b","c":1}
select obj,
obj.a
from (
select named_struct('a', 'b', 'c', 1) obj
) t1;
====執(zhí)行結(jié)果====
obj>>> {"a":"b","c":1}
obj.a>>> b
- 結(jié)構(gòu)體通過點的方式訪問元素
- 結(jié)構(gòu)體與map不同,一旦創(chuàng)建屬性個數(shù)就不能更改。
- 結(jié)構(gòu)體定義后,其類型不能做更改< name:string,age:int >;map類型定義后其每個元素的值類型就需要確定了map< string:stiring >
總結(jié):
遇到Json屬性為 {key1:value1,key2:value2 …}
- value類型都統(tǒng)一的,并且個數(shù)不確定的可以使用map類型。
- value類型不統(tǒng)一,并且個數(shù)確定的可以使用struct類型。
遇到類似數(shù)組的json數(shù)據(jù):
"actions": [{ -- 動作(事件)
"action_id": "favor_add", -- 動作id
"item": "3", -- 目標(biāo)id
"item_type": "sku_id", -- 目標(biāo)類型
"ts": 1585744376605 -- 動作時間戳
}
- 數(shù)據(jù)結(jié)構(gòu)可以嵌套使用:array< struct < key1:string,key2:int > >
- 上述json中actions為數(shù)組,元素個數(shù)不確定并且元素都能夠用struct
array<泛型> map<string:string> struct<name:string,age:int>
文章來源:http://www.zghlxwxcb.cn/news/detail-824356.html
具體問題具體分析,根據(jù)數(shù)據(jù)情況選擇合適的數(shù)據(jù)結(jié)構(gòu)。文章來源地址http://www.zghlxwxcb.cn/news/detail-824356.html
到了這里,關(guān)于大數(shù)據(jù)分析組件Hive-集合數(shù)據(jù)結(jié)構(gòu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!