Hive不仅支持基本类型,还支持比较复杂的类型,同时配套了一些函数,灵活运用这些复杂类型的字段,可以更好的设计离线表
更加详细内容可以见:
字段类型: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types
hive内置函数: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
arrays: ARRAY
maps: MAP
structs: STRUCT
primitive_type:基本类型,byte、short、int、long、float、double、string、boolean、datetime等等
data_type:包括primitive_type和Complex Types( ARRAY/ MAP/STRUCT),从上面arrays/maps/structs的定义中可以知道,复杂类型是可以嵌套的,比如ARRAY
可以把struct看作java class,array看作java.util.List,map看作java.util.map,不过需要注意MAP的key是基本类型,而java中没这个限制
另外还有一种比较常见的手段是使用json形式的字符串,hive也提供了get_json_object和json_tuple
ARRAY
创建表:create table array_test(poi_id bigint,week_uv ARRAY
插入数据:insert into table array_test select 1,array(10,20,30,40,50,60,70);
ARRAY字段展开:select explode(week_uv) from array_test;
ARRAY字段展开并包含对应的其他字段:select poi_id,tf.uv from array_test lateral view explode(week_uv) tf as uv;
其他函数:array_contains()检查是否包含,size()元素个数,sort_array()排序
注意:
-
其他复杂字段的展开形式也是类似的的形式,只不过MAP和STRUCT稍微复杂一些
-
可以定义array
> 这样的字段,也就是struct类型的数组
MAP
创建表:create table map_test(poi_id bigint,week_uv MAP
插入数据:insert into table map_test select 1,map('Monday',122,'Tuesday',133,'Wed',332,'Thu',333);
MAP的某个key做列:
select poi_id,week_uv['Monday'] as mon_uv,week_uv['Tuesday'] as tue_uv from map_test;
MAP展开:
MAP字段展开并包含对应的其他字段:
其他函数: size()、map_keys()、map_values()
STRUCT
创建表: CREATE TABLE `struct_array_test`( `poi_id` int, `hot_spots` array
插入数据:insert into table struct_array_test select 1,array(named_struct('hotspot','guokao',uv,123),named_struct('hotspot','guoqing',uv,1123);
只取某个字段,使用字段名.属性名的形式,由于是array
多种形式展开:
array展开
array展开同时struct也展开(inline):
JSON String
创建表:CREATE TABLE `json_test`( `json_obj` string, `json_obj_arr` string) 两个字段,一个json object 一个 json object array
数据:
(注意,返回的[1,2] [3,4]不是数组,是string,这会给应用上带来不便)
json的展开:可以当作数据表的一列来写sql
get_json_object的性能要比json_tuple要好一些