第3章 数据类型和文件格式
Hive 所支持的基本数据类型。
3.1 基本数据类型
数据类型 | 长度 | 例子 |
---|---|---|
TINYINT | 1byte | 20 |
SMALINT | 2byte | 20 |
INT | 4byte | 20 |
BIGINT | 8byte | 20 |
BOOLEAN | true 或者 false | TRUE |
FLOAT | 单精度浮点数 | 3.14159 |
DOUBLE | 双精度浮点数 | 3.14159 |
STRING | 4byte | 20 |
TIMESTRAMP | 整数,浮点数或者字符串 | 13278823 13278823.123432 ‘2012-02-03 12:34:45 |
BINARY | 字节数组 |
TIMESTRAMPS 表示的是UTC时间。Hive本身提供了不同时区互相转换的内置函数,(to_utc_timestamp函数和from_utc_timestamp函数)
字符串类型的列转换为数值:
s是一个字符串类型,其值为数值
…cast( s AS INT )…
3.2 集合数据类型
Hive 中的列支持使用struct,map和array集合数据类型。
数据类型 | 描述 | 字面语法示例 |
---|---|---|
STRUCT | 和C语言中的stuct或者“对象”类似,都可以通过“点”符号访问元素内容。例如某个列数据类型是STRUCT{first STRING,last STRING},那第一个元素可以通过 字段名.first来引用 | struct(‘John’,‘Doe’) |
MAP | MAP是一组键-值对元组集合,使用数组表示法(例如[key])可以访问元素。例如某个列的数据类型是MAP,其中键->值对是’first’->‘John’和’last’->‘Doe’,那么可以通过字段名*[last]*获取最后一个元素 | map(‘first’,‘John’,‘last’,‘Doe’) |
ARRAY | 数组是一组具有相同类型和名称的变量的集合。例如,数组值为[‘John’,‘Doe’],那么第2个元素可以通过*数组名[1]*进行引用 | Array(‘John’,‘Doe’) |
CREATE TABLE employee (
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING,FLOAT>,
address STRUCT<street:STRING,city:STRING,state:STRING>)
其中 name 是一个简单的字符串;salary 使用float浮点数类型;subordinates (下属员工)列表是一个字符串值数组。在该数组中,我们可以认为name是“主键”,因此subordinates中每一个元素都将引用这张表中的另一条记录。对于没有下属的雇员,这个字段对应的值也就是空。
字段 deductions 是一个由键-值对构成的map,记录了每一个扣款项目的扣除额。在传统数据模型中,这个扣除额项目的名称(map的键)可能存在于不同的表中。这些表在存放特定扣除额数值的同时,还有一个外键指向对应的雇员记录。
最后,每名雇员的佳通住址使用struct数据类型存储,其中每个域都作了命名并且具有一个特定的类型。
3.3 文本文件数据编码
逗号分隔值(CSV)或者制表符分隔值(TSV)。
Hive 中默认的记录和字段分隔符
分隔符 | 描述 |
---|---|
\n | 对于文本文件来说,每行都是一条记录,因此换行符可以分隔记录 |
^A | 用于分隔字段(列)\001 |
^B | 用于分隔ARRAY或者STRUCT中的元素,或者MAP中键-值对之间的分隔 \002 |
^C | 用于MAP中键和值之间的分隔 \003 |
3.4 读时模式
Hive 对于底层存储没有控制,对于Hive要查询的数据,有很多方式对其进行创建、修改,甚至损坏。因此,Hive不会在数据加载时进行验证,而是在查询时进行,也就是读时模式(schema on read)。
那么如果模式和文件内容不匹配时,因为H可以读取这些数据,如果每行记录中的字段少于对应的模式中定义的字段个数的话,那么用户将会看到查询结果中很多的null值。
如果某些字段是数值型的,但是Hive在读取时发现存在非数值型的字符串值的话,将会返回null值。