Hive 总结之数据类型归纳
1. 背景
- Hive的本质是一个转换工具,将类sql语句(HQL)转换为mapreduce程序或者类mapreduce程序(hadoop的mapreduce或者spark)。
- Hive可以处理结构化数据并转换为一张表来提供对外的数据查询和分析。但本身不能存储数据。
- Hive的表的元数据(schema等信息)存储在数据库中,一般配置为使用mysql存储,不设置就是默认的derby数据库存储。数据信息则存储在hdfs中。
- 既然涉及到类SQL(HQL),则必定语法上主体和SQL规范很接近,同样会有数据类型。
- 本文就是关于数据类型的文章
2. 基本数据类型
会将Hive数据类型和Java数据类型进行对比,数据长度 和示例。
- TINYINT:1byte有符号整数如20,可以类比java的byte类型
- SMALINT:2byte有符号整数如20,可以类比java的short类型
- INT:4byte有符号整数如20,可以类比java的int的类型。
注意,不管在哪种编程语言(sql也是一种编程语言),int和double都是主要的数据类型,当然特殊场景下会有变化。 - BIGINT:8byte有符号整数如10000,可以类比java的long类型
- BOOLEAN:布尔类型,true或者false如TRUE、 FALSE,可以类比Java的boolean类型。
- FLOAT:单精度浮点数如3.14159,可以类比java的 float类型。
注意,在阿里巴巴的java开发规范中,一般禁止使用float和double,因为读写时都会有精度损失,一般使用decimal代替,不过这是HQL,如果可以的话,使用string存储浮点数也是一种解决办法。 - DOUBLE:双精度浮点数如3.14159,可以类比java 的double类型。注意点同上
- STRING:字符系列。可以指定字符集。可以使用单引号或者双引号。如‘now is the time’ 、“for all good men”,可以类比java的string类型。也可以类比sql的varchar可变字符串类型。
- TIMESTAMP:时间类型
- BINARY:字节数组
在HQL中,一般常用的是时间、int、string类型,其他基本类型了解即可。因为HQL主要用于处理海量数据情形,很多时候都是处理结构化文本数据,这时候字符串类型较多。
3. 集合数据类型
3.1 集合类型概述
- STRUCT(结构体)对象,和c语言以及swift语言中的struct类似,都可以通过“点”符号访问元素内容。
- 例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段.first来引用。
- 示例如 struct()
- MAP 映射,MAP是一组键-值对元组集合,使用数组表示法可以访问数据。
- 例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素
- 示例如map()
- ARRAY 数组,数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。
- 例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用。
- 示例如Array()
注意:
- SQL以及HQL都可以算是一种编程语言,所有都有数据类型、有运算,有方法,输入的SQL需要解析和编译才能运行。
- 数组、字典、struct结构体都算是复杂的数据类型,但也是使用最多的数据集合。struct可以类比java中的对象。运训多层嵌套来表达复杂数据结构。
3.2 案例演示
- 原始json文件
{
"name": "niumowang",
"friends": ["wukong" , "shiziwang"] , //列表Array
"children": {//键值Map
"honghaier": 12 ,
"honghaier2": 14
}
"address": { //结构Struct
"street": "shandong" ,
"city": "gaoshan"
}
}
- 将json文件转化为分隔符替代大括号等符号的文本文件
niumowang,wukong_shiziwang,honghaier:18_honghaier2:19,shandong_gaoshan
erlangshen,meishan1_meishan2,xiaoerlang1:18_xiaoerlang3:19,shandong_meishan
- 将这个文本文件上传到linux节点上,并建立hive数据表,再将这个文本文件中数据加载到这个表中。
create table tb_xiyouji(
name string,
friends array<string>,
children map<string, int>,
address struct<hole:string, mountain: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’; – 行分隔符
- 建表语句执行
- 建表之后查看数据库中表数量和名字
show tables;
- 建表之后查看表信息
desc formatted tb_xiyouji;
- 导入数据到表中
load data local inpath '/root/doit/dataType/dataType.txt' into table tb_xiyouji;
查看所有表中数据
4. 类型转化
4.1 类型概述
- 和编程语言java一样,HQL的,也就是hive的基本数据类型也是可以进行隐式转换的。
- 例如一个表达式中的数据类型同时具有int和tinyint,则tinyint会被转换为int进行运算,这一点和java的规则是一样的。
- 同样的,隐式转换只存在于小数据类型转换为大数据类型,因为这样不会产生精度丢失。
- 而不会有大数据类型隐式转换为小数据类型,除非使用强制转换。这一点也是和java一样。HQL中的隐式转换使用cast函数
- 隐式转换的规则和java一样,小数据类型可以转换为任何更大的数字数据类型(注意只限制于整数类型内部如tinyint、smallint、int、bigint以及float、double之间。当然如果是整数和浮点数也是可以的)
- 注意boolean类型不是数字类型,所以不可以参与转换为数字类型如int、float等
4.2 cast用法
HQL中方法分为系统定义函数、自带函数、自定义函数。
cast属于系统定义函数,
select cast('1' as int);
5. hive函数查看和文档查看
- 如果需要查阅hive自带函数,也就是hive提供的函数,可以采用如下方式查阅文档
- 如何使用hive自带文档进行函数查阅
show functions;
- 查看函数文档
desc function explode;
- 查阅官方文档
官方文档
版权声明:本文为xiaohu21原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。