HIVE中關于collect_set與explode函數妙用
hive的復合數據類型
Hive中的列支持使用三類復雜的集合數據類型,即:array,map及struct,這些類型的名稱是保留字,具體用法可參見該篇博文,里面有關于三類基本集合數據類型的操作實例,注:map中可嵌套array類型。
例如,定義表:
- create table example (
- device_id string,
- login_ip array<string>,
- user_info map<string,array<string>>
- address struct<street:string,city:string,state:string>
- )
- row format delimited
- fields terminated by '\001'
- collection items terminated by '\002'
- map keys terminated by '\003'
- lines terminated by '\n'
- stored as RCFile;
假設這樣的數據類型以分區表存儲,你要統計一段時間類no=1下的去重score,那么該怎么辦了?這里可配合使用lateral view首先實現列轉行的功能,如下所示:
select no,score from tablaa lateral view explode(score_set) xxx as score;
注:xxx代表虛表名稱,不能缺少。
進一步深化上述代碼解決統計一段時間的去重值,可寫為:
select no,collect_set(score) from tablaa lateral view explode(score_set) xxx as score group by no;
這樣,將兩個函數結合實現了行轉列或列轉行的妙用。