Hive教程(三)---Hive数据类型

目录

3.1基本数据类型

3.2集合数据类型

3.3类型转化

3.4集合数据类型创建和查询

       3.4.1 map类型创建和查询
       3.4.2 array类型创建和查询
       3.4.3 struct类型创建和查询
       3.4.4 explode在map和array使用
       3.4.5 Lateral View在map和array使用

表1-1 基本数据类型
Hive数据类型Java数据类型长度例子
TINYINTbyte1byte有符号整数20
SMALINTshort2byte有符号整数20
INTint4byte有符号整数20
BIGINTlong8byte有符号整数20
BOOLEANboolean布尔类型,true或者falseTRUE FALSE
FLOATfloat单精度浮点数3.14159
DOUBLEdouble双精度浮点数3.14159
STRINGstring字符系列。可以指定字符集。可以使用单引号或者双引号。‘now is the time’ “for all good men”
TIMESTAMP时间类型
BINARY字节数组

       对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储2GB的字符数。

3.2集合数据类型

表1-2 集合数据类型
数据类型描述语法示例
STRUCT(结构体)对象和c语言中的struct类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段.first来引用。struct()
MAP 映射MAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素map()
ARRAY 数组数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用。Array()

       Hive有三种复杂数据类型ARRAY、MAP 和 STRUCT。ARRAY和MAP与Java中的Array和Map类似,而STRUCT与C语言中的Struct类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。
        案例实操
       (1)假设某表有如下一行,我们用JSON格式来表示其数据结构。在Hive下访问的格式为

{
    "name": "songsong",
    "friends": ["bingbing" , "lili"] ,   //列表Array, 
    "children": {                        //键值Map,
        "xiao song": 18 ,
        "xiaoxiao song": 14
    }
    "address": {                         //结构Struct,
        "street": "hui long guan" ,
        "city": "beijing" 
    }
}

       (2)基于上述数据结构,我们在Hive里创建对应的表,并导入数据。
创建本地测试文件test.txt

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

注意:MAP,STRUCT和ARRAY里的元素间关系都可以用同一个字符表示,这里用“_”。

3)Hive上创建测试表test

create table test(
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 '_'  	--MAP STRUCT 和 ARRAY 的分隔符(数据分割符号)
map keys terminated by ':'				-- MAP中的key与value的分隔符
lines terminated by '\n';					-- 行分隔符

4)导入文本数据到测试表

hive (default)> load data local inpath ‘/opt/module/datas/test.txt’into table test

5)访问三种集合列里的数据,以下分别是ARRAY,MAP,STRUCT的访问方式
hive中map数据类型的数据的常用函数

hive (default)> select friends[1],children['xiao song'],address.city from test
where name="songsong";
OK
_c0     _c1     city
lili    18      beijing
 select name , fs[1] , map_keys(ch) , address.street , address.city  from demo1 ;
+-----------+-------+--------------------------------+----------------+----------+--+
|   name    |  _c1  |              _c2               |     street     |   city   |
+-----------+-------+--------------------------------+----------------+----------+--+
| songsong  | lili  | ["xiao song","xiaoxiao song"]  | hui long guan  | beijing  |
| yangyang  | susu  | ["xiao yang","xiaoxiao yang"]  | chao yang      | beijing  |
+-----------+-------+--------------------------------+----------------+----------+--+

3.3类型转化

       Hive的原子数据类型是可以进行隐式转换的,类似于Java的类型转换,例如某表达式使用INT类型,TINYINT会自动转换为INT类型,但是Hive不会进行反向转化,例如,某表达式使用TINYINT类型,INT不会自动转换为TINYINT类型,它会返回错误,除非使用CAST操作。

  1. 隐式类型转换规则如下:
    (1)任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。
    (2)所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。
    (3)TINYINT、SMALLINT、INT都可以转换为FLOAT。
    (4)BOOLEAN类型不可以转换为任何其它的类型。
  2. 可以使用CAST操作显示进行数据类型转换
    例如CAST(‘1’ AS INT)将把字符串’1’ 转换成整数1;如果强制类型转换失败,如执行CAST(‘X’ AS INT),表达式返回空值 NULL。

3.4集合数据类型创建和查询

3.4.1 map类型创建和查询

操作步骤

## 建表语句
create table hive_map(id int , name string , data_map map<string,string>)
row format delimited fields terminated by ' '
collection items terminated by ','
map keys terminated by ':';

## 原始数据
1 zs father:zsfa,moter:zsmo,brother:zsbr
2 ls father:lsfa,moter:lsmo,brother:lsbr-lsbr2

## 加载数据
load data local inpath '/root/data/hive-map.txt' overwrite into table hive_map;

## 数据查询
-- map_keys
select id,name,map_keys(data_map) from hive_map;

-- map_values:返回key和value的数组
select id,name,map_values(data_map) from hive_map;

-- 字段[key]
select id,name,data_map['brother'] from hive_map;

结果展示

hive> show tables;
OK
Time taken: 0.036 seconds
hive> create table hive_map(id int , name string , data_map map<string,string>)
    > row format delimited fields terminated by ' '
    > collection items terminated by ','
    > map keys terminated by ':';
OK
Time taken: 0.059 seconds
hive> load data local inpath '/root/data/hive-map.txt' overwrite into table hive_map;
Loading data to table default.hive_map
OK
Time taken: 0.625 seconds
hive> select id,name,map_keys(data_map) from hive_map;
OK
1	zs	["father","moter","brother"]
2	ls	["father","moter","brother"]
Time taken: 0.159 seconds, Fetched: 2 row(s)
hive> select id,name,map_values(data_map) from hive_map;
OK
1	zs	["zsfa","zsmo","zsbr"]
2	ls	["lsfa","lsmo","lsbr-lsbr2"]
Time taken: 0.163 seconds, Fetched: 2 row(s)
hive> select id,name,data_map['brother'] from hive_map;
OK
1	zs	zsbr
2	ls	lsbr-lsbr2
Time taken: 0.18 seconds, Fetched: 2 row(s)
hive> 
3.4.2 array类型创建和查询
## 建表语句
create table hive_array(name string , data_array array<string>)
row format delimited fields terminated by ' '
collection items terminated by ',';

## 原始数据
1 xiaohui,taoge,xingge,lianhang,guanyu
2 najie,xiaoqiao
3 余辉,涛哥,星哥,念行,冠宇
4 娜姐,小乔

## 加载数据
load data local inpath '/root/data/hive-array.txt' overwrite into table hive_array;

## 数据查询
select name , data_array from hive_array;
-- size 数组长度
select name , data_array ,size(data_array) from hive_array;
--  字段[角标]
select name , data_array[0] ,size(data_array) from hive_array;
-- array_contains 函数:判断数组是否包含指定元素
select name , array_contains(data_array,"xiaohui") ,size(data_array) from hive_array;

结果展示

hive> create table hive_array(name string , data_array array<string>)
    > row format delimited fields terminated by ' '
    > collection items terminated by ',';
OK
Time taken: 0.052 seconds
hive> load data local inpath '/root/data/hive-array.txt' overwrite into table hive_array;
Loading data to table default.hive_array
OK
Time taken: 0.581 seconds
hive> select name , data_array from hive_array;
OK
1	["xiaohui","taoge","xingge","lianhang","guanyu"]
2	["najie","xiaoqiao"]
3	["余辉","涛哥","星哥","念行","冠宇"]
4	["娜姐","小乔"]
Time taken: 0.175 seconds, Fetched: 4 row(s)
hive> select name , data_array ,size(data_array) from hive_array;
OK
1	["xiaohui","taoge","xingge","lianhang","guanyu"]	5
2	["najie","xiaoqiao"]	2
3	["余辉","涛哥","星哥","念行","冠宇"]	5
4	["娜姐","小乔"]	2
Time taken: 0.119 seconds, Fetched: 4 row(s)
hive> select name , data_array[0] ,size(data_array) from hive_array;
OK
1	xiaohui	5
2	najie	2
3	余辉	5
4	娜姐	2
Time taken: 0.169 seconds, Fetched: 4 row(s)
hive> select name , array_contains(data_array,"xiaohui") ,size(data_array) from hive_array;
OK
1	true	5
2	false	2
3	false	5
4	false	2
Time taken: 0.16 seconds, Fetched: 4 row(s)
hive> 
3.4.3 struct类型创建和查询
## 建表语句
create table hive_struct(id int , userinfo struct<name:string,age:int,sex:string,major:string>)
row format delimited fields terminated by ' '
collection items terminated by ':';

## 原始数据
1 xiaohui:18:M:teacher
2 lisi:30:W:student

## 加载数据
load data local inpath '/root/data/hive-struct.txt' overwrite into table hive_struct;

## 数据查询
select id, userinfo.name,userinfo.age,userinfo.sex,userinfo.major from hive_struct;

结果展示

hive> create table hive_struct(id int , userinfo struct<name:string,age:int,sex:string,major:string>)
    > row format delimited fields terminated by ' '
    > collection items terminated by ':';
OK
Time taken: 0.064 seconds
hive> load data local inpath '/root/data/hive-struct.txt' overwrite into table hive_struct;
Loading data to table default.hive_struct
OK
Time taken: 0.583 seconds
hive> select id, userinfo.name,userinfo.age,userinfo.sex,userinfo.major from hive_struct;
OK
1	xiaohui	18	M	teacher
2	lisi	30	W	student
Time taken: 0.172 seconds, Fetched: 2 row(s)
hive> select id,userinfo from hive_struct;
OK
1	{"name":"xiaohui","age":18,"sex":"M","major":"teacher"}
2	{"name":"lisi","age":30,"sex":"W","major":"student"}
Time taken: 0.144 seconds, Fetched: 2 row(s)
3.4.4 explode在map和array使用

       explode就是将hive一行中复杂的array或者map结构拆分成多行。

0: jdbc:hive2://hadoop11:10000> select explode(data_map) from hive_map;
+----------+-------------+
|   key    |    value    |
+----------+-------------+
| father   | zsfa        |
| moter    | zsmo        |
| brother  | zsbr        |
| father   | lsfa        |
| moter    | lsmo        |
| brother  | lsbr-lsbr2  |
+----------+-------------+


0: jdbc:hive2://hadoop11:10000> select explode(data_array) from hive_array;
+-----------+
|    col    |
+-----------+
| xiaohui   |
| taoge     |
| xingge    |
| lianhang  |
| guanyu    |
| najie     |
| xiaoqiao  |
| 余辉        |
| 涛哥        |
| 星哥        |
| 念行        |
| 冠宇        |
| 娜姐        |
| 小乔        |
+-----------+


0: jdbc:hive2://hadoop11:10000> select 
. . . . . . . . . . . . . . . > row_number() over() as num , a.col as name 
. . . . . . . . . . . . . . . > from (
. . . . . . . . . . . . . . . > select explode(data_array) from hive_array
. . . . . . . . . . . . . . . > ) a;
+------+-----------+
| num  |   name    |
+------+-----------+
| 1    | 小乔        |
| 2    | 娜姐        |
| 3    | 冠宇        |
| 4    | 念行        |
| 5    | 星哥        |
| 6    | 涛哥        |
| 7    | 余辉        |
| 8    | xiaoqiao  |
| 9    | najie     |
| 10   | guanyu    |
| 11   | lianhang  |
| 12   | xingge    |
| 13   | taoge     |
| 14   | xiaohui   |
+------+-----------+
3.4.5 Lateral View在map和array使用

       横向视图与用户定义的表生成函数(如 explode())结合使用。 如内置表生成函数中所述,UDTF 为每个输入行生成零个或多个输出行。 横向视图首先将 UDTF 应用于基表的每一行,然后将结果输出行连接到输入行,以形成具有所提供的表别名的虚拟表。
       在 Hive 0.6.0 之前,横向视图不支持谓词下推优化。 在 Hive 0.5.0 及更早版本中,如果您使用 WHERE 子句,则查询可能尚未编译。 解决方法是添加 set hive.optimize.ppd = false; 在你的查询之前。 修复是在 Hive 0.6.0 中完成的; 请参阅 https://issues.apache.org/jira/browse/HIVE-1056:谓词下推不适用于 UDTF。
       从 Hive 0.12.0 开始,可以省略列别名。 在这种情况下,别名是从 UTDF 返回的 StructObjectInspector 的字段名继承的。

# Lateral View在map使用
0: jdbc:hive2://hadoop11:10000> with test as (
. . . . . . . . . . . . . . . > select data_map from hive_map
. . . . . . . . . . . . . . . > )
. . . . . . . . . . . . . . . > 
. . . . . . . . . . . . . . . > select 
. . . . . . . . . . . . . . . > row_number() over() as num ,t1.key ,t1.value
. . . . . . . . . . . . . . . > from test  LATERAL VIEW explode(data_map) t1 ;
+------+----------+-------------+
| num  |  t1.key  |  t1.value   |
+------+----------+-------------+
| 1    | brother  | lsbr-lsbr2  |
| 2    | moter    | lsmo        |
| 3    | father   | lsfa        |
| 4    | brother  | zsbr        |
| 5    | moter    | zsmo        |
| 6    | father   | zsfa        |
+------+----------+-------------+



# Lateral View在array使用
0: jdbc:hive2://hadoop11:10000> with test as (
. . . . . . . . . . . . . . . > select data_array as b from hive_array
. . . . . . . . . . . . . . . > )
. . . . . . . . . . . . . . . > 
. . . . . . . . . . . . . . . > select 
. . . . . . . . . . . . . . . > row_number() over() as num ,name
. . . . . . . . . . . . . . . > from test  LATERAL VIEW explode(b) t1 AS name;

+------+-----------+
| num  |   name    |
+------+-----------+
| 1    | 小乔        |
| 2    | 娜姐        |
| 3    | 冠宇        |
| 4    | 念行        |
| 5    | 星哥        |
| 6    | 涛哥        |
| 7    | 余辉        |
| 8    | xiaoqiao  |
| 9    | najie     |
| 10   | guanyu    |
| 11   | lianhang  |
| 12   | xingge    |
| 13   | taoge     |
| 14   | xiaohui   |
+------+-----------+



北京小辉微信公众号

在这里插入图片描述

大数据资料分享请关注
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值