Hive不仅支持基本类型,还支持比较复杂的类型,同时配套了一些函数,灵活运用这些复杂类型的字段,可以更好的设计离线表

更加详细内容可以见:

字段类型: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

hive内置函数: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

arrays: ARRAY<data_type>

maps: MAP<primitive_type, data_type>

structs: STRUCT<col_name : data_type [COMMENT col_comment], ...>

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>

可以把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<int>);

插入数据: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<hotspot:string,uv:int>> 这样的字段,也就是struct类型的数组

MAP

创建表:create table map_test(poi_id bigint,week_uv MAP<string,int>);

插入数据: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展开:​

9085769559?contentType=1&isNewContent=false

MAP字段展开并包含对应的其他字段:

9089040257?contentType=1&isNewContent=false

其他函数: size()、map_keys()、map_values()

STRUCT

创建表: CREATE TABLE `struct_array_test`(  `poi_id` int, `hot_spots` array<struct<hotspot:string,uv:int>>); 注意,这个是array<struct>字段

插入数据:insert into table struct_array_test select 1,array(named_struct('hotspot','guokao',uv,123),named_struct('hotspot','guoqing',uv,1123);

只取某个字段,使用字段名.属性名的形式,由于是array<struct>因此返回的是array<string>

9097051710?contentType=1&isNewContent=false

多种形式展开:

array展开

image.jpeg

array展开同时struct也展开(inline):

9094841098?contentType=1&isNewContent=false

JSON String

创建表:CREATE TABLE `json_test`( `json_obj` string, `json_obj_arr` string) 两个字段,一个json object 一个 json object array

数据:

image.jpeg

9093961232?contentType=1&isNewContent=false

9096848580?contentType=1&isNewContent=false

(注意,返回的[1,2] [3,4]不是数组,是string,这会给应用上带来不便)

json的展开:可以当作数据表的一列来写sql

image.jpeg

get_json_object的性能要比json_tuple要好一些

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐