Hive中的复杂类型(array/map/struct/json)

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>); 注意,这个是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展开

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要好一些

你可能感兴趣的:(hive,json,java,hadoop,数据仓库)