转载请注明~
在学习了Linux系统操作命令和shell编程之后,将进入到hive的学习中,先主要介绍hive的数据类型和文件格式。
01数据类型
基本数据类型
Hive 提供了基本数据类型和复杂数据类型
整型
TINYINT — 微整型,只占用1个字节,只能存储0-255的整数。
SMALLINT– 小整型,占用2个字节,存储范围–32768 到 32767。
INT– 整型,占用4个字节,存储范围-2147483648到2147483647。
BIGINT– 长整型,占用8个字节,存储范围-263到263-1。
布尔型
BOOLEAN — TRUE/FALSE
浮点型
FLOAT– 单精度浮点数。
DOUBLE– 双精度浮点数。
字符串型
STRING– 不设定长度。
复杂数据类型
Structs:一组由任意数据类型组成的结构。比如,定义一个字段C的类型为STRUCT {a INT; b STRING},则可以使用a和C.b来获取其中的元素值;
Maps:和Java中的Map相同,即存储K-V对的;
Arrays:数组;
复杂数据类型的声明必须使用尖括号指明其中数据字段的类型。定义三列,每列对应一种复杂的数据类型,如下所示。
CREATE TABLE complex(
col1 ARRAY< INT>,
col2 MAP< STRING,INT>,
col3 STRUCT< a:STRING,b:INT,c:DOUBLE>)
TIMESTAMP
新增数据类型 TIMESTAMP的值可以是整数,也就是距离Unix新纪元时间(1970年1月1日,午夜12点)的秒数;也可以是浮点数,即距离Unix新纪元时间的秒数,精确到纳秒(小数点后保留9位数);还可以是字符串,即JDBC所约定的时间字符串格式,格式为YYYY-MM-DD hh:mm:ss.fffff
数据类型转换
1)显式转换
使用cast函数可以对指定的值进行数据类型转换。
cast(value AS TYPE)
value是需要被转换的数据, AS是固定关键字,type是需要转换的类型
常用转换一般是数字类型和字符串之间进行互转,
cast(2019 AS STRING)
cast('2019' AS INT)
然cast的转换功能也不是万能的,必须是“存储的类型值”符合转换条件才能进行转换,否则会返回NULL,比如“XYZ”转换成FLOAT,很明显XYZ不是数值,所以转换失败,结果返回NULL值。
此外,如果使用cast将值范围较大的数据类型转换成值范围较小的数据类型,cast函数会直接截取,损失数据精度甚至得到错误结果,需要慎用。
2)隐式转换
当有以下不同数据类型的列互相运算时,Hive会自动把值范围较小的数据类型转为值范围较大的数据类型。
大小顺序如下:
TINYINT < SMALINT < INT < BIGINT < FLOAT < DOUBLE
02文件格式
TEXTFILE //文本,默认值
SEQUENCEFILE // 二进制序列文件
RCFILE //列式存储格式文件 Hive0.6以后开始支持 RCFile是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。
ORC //列式存储格式文件,比RCFILE有更高的压缩比和读写效率,Hive0.11以后开始支持数据按行分块 每块按照列存储 ,压缩快 快速列存取,效率比rcfile高,是rcfile的改良版本,相比RC能够更好的压缩,能够更快的查询,但还是不支持模式演进。
PARQUET //列出存储格式文件,Hive0.13以后开始支持
注意】hive默认的文件格式是TextFile,可通过set hive.default.fileformat 进行配置
【行式存储与列式存储】
行式存储一定会把同一行数据存到同一个块中,在select查询的时候,是对所有字段的查询,不可以单独查询某一行
列式存储同一列数据一定是存储到同一个块中,换句话说就是不同的列可以放到不同块中,在进行select查询的时候可以单独查询某一列。
如何创建不同的文件类型可参考下面的参考文献
参考文献
https://www.cnblogs.com/xuziyu/p/10737199.html
03Hive和其他SQL的数据格式有何区别
在其他SQL方言中,通常会提供限制最大长度的“字符数组”(也就是很多字符串)类型,但Hive中不支持这种数据类型。
关系型数据库提供这个功能是出于性能优化的考虑。因为定长的记录更容易进行建立索引,数据扫描,等等。
在Hive所处的“宽松”的世界里,不一定拥有数据文件但必须能够支持使用不同的文件格式,Hive根据不同字段间的分隔符来对其进行判断。同时, Hadoop和Hive强调优化磁盘的读和写的性能,而限制列的值的长度相对来说并不重要
版权声明:本文为CSDN博主「风影楼前」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_23897391/article/details/89171803