CC00006.hadoop——|Hadoop&Hive.V06|——|Hive.v06|Hive数据类型转换|

本文详细介绍了Hive中的数据类型,包括基本数据类型如整型、浮点型、字符串、时间戳和布尔型,以及集合数据类型如数组、映射、结构和联合类型。Hive支持数据类型的隐式转换,并且提供了显示转换方法如cast函数。此外,文章还讨论了Hive如何处理文本文件数据编码,包括默认分隔符和自定义文件格式。最后,提到了Hive的读时模式,即在读取数据时进行数据格式检查的特点。
摘要由CSDN通过智能技术生成
一、数据类型与文件格式
~~~     [Hive数据类型之基本数据类型及转换]
~~~     [Hive数据类型之集合数据类型]
~~~     [Hive文本文件数据编码及读时模式]
### --- 数据类型与文件格式

~~~     Hive支持关系型数据库的绝大多数基本数据类型,同时也支持4种集合数据类型。
### --- 基本数据类型及转换

~~~     Hive类似和java语言中一样,会支持多种不同长度的整型和浮点类型数据,
~~~     同时也支持布尔类型、字符串类型,时间戳数据类型以及二进制数组数据类型等。具体的如下表:
大类类型
Integers(整型)
TINYINT -- 1字节的有符号整数         SMALLINT -- 2字节的有符号整数
INT -- 4字节的有符号整数                 BIGINT -- 8字节的有符号整数
Floating point
numbers(浮点数)
FLOAT -- 单精度浮点数
DOUBLE -- 双精度浮点数
Fixed point
numbers(定点数)
DECIMAL -- 17字节,任意精度数字。
通常用户自定义decimal(12, 6)
String(字符串)
STRING -- 可指定字符集的不定长字符串
VARCHAR -- 1-65535长度的不定长字符串    CHAR -- 1-255定长字符串
Datetime(时间日期类型)
STRTIMESTAMP -- 时间戳(纳秒精度)         DATE -- 时间日期类型
Boolean(布尔类型)BOOLEAN -- TRUE / FALSE
Binary types(二进制类型)
BINARY -- 字节序列
~~~     # 这些类型名称都是 Hive 中保留字。
~~~     这些基本的数据类型都是 java 中的接口进行实现的,因此与 java 中数据类型是基本一致的:
Hive数据类型
Java数据类型
长度样例
TINYINTbyte1byte有符号整数20
SMALLINTshort2byte有符号整数30
INTint4byte有符号整数40
BIGINTlong8byte有符号整数50
BOOLEANboolean布尔类型TURE / FALSE
FLOATfloat单精度浮点数3.14159
DOUBLEdouble双精度浮点数3.14159
STRINGstring字符系列,可指定字符集;
可使用单引号或双引号
'The Apache Hive datawarehouse softwarefacilitates'
TIMESTAMP时间类型
BINARY字节数组
二、数据类型的隐式转换
### --- 数据类型的隐式转换

~~~     Hive的数据类型是可以进行隐式转换的,类似于Java的类型转换。
~~~     如用户在查询中将一种浮点类型和另一种浮点类型的值做对比,
~~~     Hive会将类型转换成两个浮点类型中值较大的那个类型,
~~~     即:将FLOAT类型转换成DOUBLE类型;当然如果需要的话,任意整型会转化成DOUBLE类型。 
~~~     Hive 中基本数据类型遵循以下层次结构,按照这个层次结构,子类型到祖先类型允许隐式转换。
三、总的来说数据转换遵循以下规律:
### --- 总的来说数据转换遵循以下规律:

~~~     任何整数类型都可以隐式转换为一个范围更广的类型。tinylnt=>Int; Int=>bigint
~~~     所有整数类型、float、string(都是数字)都可以隐式转换为Double
~~~     tinyint、smalint、int=>float
~~~     Boolean不能转换;
hive (default)> select '1.0' + 2;
OK
3.0
hive (default)> select '1111' > 10;
OK
hive (default)> select 1 > 0.8;
OK
四、数据类型的显示转换
### --- 数据类型的显示转换

~~~     使用cast函数进行强制类型转换;如果强制类型转换失败,返回NULL
hive> select cast('1111s' as int);
OK
NULL
hive> select cast('1111' as int);
OK
1111

五、集合数据类型
### --- 集合数据类型

~~~     Hive支持集合数据类型,包括array、map、struct、union
类型描述字面量示例
ARRAY有序的相同数据类型的集合array(1,2)
MAPkey-value对。key必须是基本数据类型,value不限map('a', 1, 'b',2)
STRUCT不同类型字段的集合类似于C语言的结构体struct('1',1,1.0),
named_struct('col1', '1', 'col2', 1,'clo3', 1.0)
UNION不同类型的元素存储在同一字段的不同行中create_union(1, 'a', 63)
### --- 和基本数据类型一样,这些类型的名称同样是保留字;

~~~     ARRAY 和 MAP 与 Java 中的 Array 和 Map 类似;
~~~     STRUCT 与 C 语言中的 Struct 类似,它封装了一个命名字段集合,
~~~     复杂数据类型允许任意层次的嵌套;
hive> select array(1,2,3);
OK
[1,2,3]

~~~     # 使用 [] 访问数组元素
hive> select arr[0] from (select array(1,2,3) arr) tmp;

hive> select map('a', 1, 'b', 2, 'c', 3);
OK
{"a":1,"b":2,"c":3}
~~~     # 使用 [] 访问map元素
hive> select mymap["a"] from (select map('a', 1, 'b', 2, 'c',
3) as mymap) tmp;

~~~     # 使用 [] 访问map元素。 key 不存在返回 NULL
hive> select mymap["x"] from (select map('a', 1, 'b', 2, 'c',
3) as mymap) tmp;

NULL
hive> select struct('username1', 7, 1288.68);
OK
{"col1":"username1","col2":7,"col3":1288.68}
~~~     # 给 struct 中的字段命名

hive> select named_struct("name", "username1", "id", 7,
"salary", 12880.68);
OK
{"name":"username1","id":7,"salary":12880.68}

~~~     # 使用 列名.字段名 访问具体信息
hive> select userinfo.id
    > from (select named_struct("name", "username1", "id",
7, "salary", 12880.68) userinfo) tmp;
~~~     # union 数据类型

hive> select create_union(0, "zhansan", 19, 8000.88) uinfo;

六、文本文件数据编码
### --- Hive表中的数据在存储在文件系统上,

~~~     Hive定义了默认的存储格式,也支持用户自定义文件存储格式。
~~~     Hive默认使用几个很少出现在字段值中的控制字符,来表示替换默认分隔符的字符。
~~~     Hive默认分隔符
id name age hobby(array) score(map)
字段之间:^A
元素之间: ^B
key-value之间:^C
666^Alisi^A18^Aread^Bgame^Ajava^C97^Bhadoop^C87

create table s1(
id int,
name string,
age int,
hobby array<string>,
score map<string, int>
);
load data local inpath '/home/hadoop/data/s1.dat' into table
s1;
select * from s1;
分隔符名称说明
\n换行符用于分隔行。每一行是一条记录,使用换行符分割数据
^A < Ctrl >+A用于分隔字段。在CREATE TABLE语句中使用八进制编码\001表示
^B< Ctrl >+B用于分隔 ARRAY、MAP、STRUCT 中的元素。
在CREATETABLE语句中使用八进制编码\002表示
^C< Ctrl +C>Map中 key、value之间的分隔符。
在CREATE TABLE语句中使用八进制编码\003表示
### --- Hive 中没有定义专门的数据格式,数

~~~     据格式可以由用户指定,用户定义数据格式需要指定三个属性:
~~~     列分隔符(通常为空格、"\t"、"\x001")、行分隔符("\n")以及读取文件数据的方法。
~~~     在加载数据的过程中,Hive 不会对数据本身进行任何修改,
~~~     而只是将数据内容复制或者移动到相应的 HDFS 目录中。
~~~     将 Hive 数据导出到本地时,系统默认的分隔符是^A、^B、^C 这些特殊字符,
~~~     使用cat 或者 vim 是看不到的;
~~~     在 vi 中输入特殊字符:
(Ctrl + v) + (Ctrl + a) => ^A
(Ctrl + v) + (Ctrl + b) => ^B
(Ctrl + v) + (Ctrl + c) => ^C
~~~     ^A / ^B / ^C 都是特殊的控制字符,使用 more 、 cat 命令是看不见的;
~~~     可以使用cat -A file.dat

七、读时模式
### --- 读时模式

~~~     在传统数据库中,在加载时发现数据不符合表的定义,则拒绝加载数据。
~~~     数据在写入数据库时对照表模式进行检查,这种模式称为"写时模式"(schema on write)。
~~~     写时模式 -> 写数据检查 -> RDBMS;
~~~     Hive中数据加载过程采用"读时模式" (schema on read),加载数据时不进行数据格式的校验,
~~~     读取数据时如果不合法则显示NULL。这种模式的优点是加载数据迅速。
~~~     读时模式 -> 读时检查数据 -> Hive;好处:加载数据快;问题:数据显示NULL
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanqi_vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值