背景:Hive中复杂的数据类型主要有map、struct、named_struct、array和create_union五种,其中前四种用的比较多。
一、四种常用的复杂数据类型
1.map
map中保存的是k-v对的数据,map名[key值] = 对应的value值
select map
(“aa”,1,1,“bb”) > {“aa”:“1”,“1”:“bb”}
select map
(“aa”,1,1,“bb”)[“aa”] > 1
2.struct
struct中保存的是value值,相当于对象,stuct名.col1 = value1
select struct(1,2,3) > {“col1”:1,“col2”:2,“col3”:3}
select struct(1,2,3).col1 > 1
3.named_struct
stuct中保存的是key-value对的数据,相当于对象,struct.key值 = value值,由于key值可以自定义,所以比struct好用。
select named_struct(“name”,“ch”,“age”,18) > {“name”:“ch”,“age”:18}
select named_struct(“name”,“ch”,“age”,18).name > ch
4.array
array中保存的是value值,array名[index值] = 对应位置的value值(index从0开始)
select array
(1,2,3) > [1,2,3]
select array
(1,2,3)[0] > 1
二、map和named_struct的区别及该如何选择?
区别:
map和struct中都保存的k-v对,但是map中k-v对数量和类型是不确定的,而struct中k-v对数量和类型都是确定的。
选择:
如果某列的k-v对数量和类型都是确定且一样的,使用struct。例如某列保存的是用户的个人信息,包含user_id,age、gender。(named_stuct(“user_id”,“age”,“gender”)),相当于定义了一个模板,一个类。数据:named_stuct(“user_id”:“001”,“age”:18,“gender”:“M”),是这个类的对象,查询user_id属性,使用.user_id。
如果某列的k-v对数量和类型不完全一样,使用map。例如只能确定每列是key:String,value:Int类型的数据。该列某行数据是{“name”:“jack”,“age”:18},另一行数据是{“name”:“mart”,“age”:28,“gender”:“M”},则该列只能使用map不能用struct。