3.2 复杂数据类型
参考地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-Overview
Hive 有 4 中复杂类型.
arrays: ARRAY<data_type>
数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]
进行引用。maps: MAP<primitive_type, data_type>
MAP 是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’
,那么可以通过字段名[‘last’]
获取最后一个元素structs: STRUCT<col_name : data_type [COMMENT col_comment], ...>
和c语言中的struct类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING}
,那么第1个元素可以通过:字段.first
来引用。union: UNIONTYPE<data_type, data_type, ...>
联合型. 这种类型到目前支持还不完全. 建议不要使用.
复杂类型允许任意深层次的嵌套.
实例操作:
步骤1: 数据分析
假设有一行这样的数据:
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing
他表示的含义可以用下面的json
来表示
{
"name": "songsong",
"friends": [ // 这个用数组来表示
"bingbing",
"lili"
],
"children": { // 用键值对map来表示
"xiao song": 18,
"xiaoxiao song": 19
},
"address": { // 用 struct 来表示
"street": "hui long guan",
"city": "beijing"
}
}
从这个 json, 我们很容分析出来 将来要建设的表只需要 4 个字段就可以: name
, friends
, children
, address
步骤2: 准备 2 条数据
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
把数据存入到一个文件中.
步骤3: 建表
根据前面的分析建表.
create table person(
name string,
friends array<string>,
children map<string, int>,
address struct<street : string, city : string>
)
row format delimited
fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
row format delimited fields terminated by ','
: 每行中列与列的分隔符是,
collection items terminated by '_'
:array
和sturct
的分隔符是_
map keys terminated by ':'
, map 键值对的分隔符是:
lines terminated by '\n'
, 行分隔符是\n
表创建成功:
查看表结构:
步骤4: 把文件内容插入到表中
load data local inpath '/opt/module/datas/persons.txt' into table person;