类型 | 描述 |
TINYINT | 1个字节(8位)有符号整数,from -128 to 127 |
SMALLINT | 2个字节(16位)有符号整数,from -32,768 to 32,767 |
INT | 4个字节(32位)有符号整数, from -2,147,483,648 to 2,147,483,647 |
BIGINT | 8个字节(64位)有符号整数, from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
FLOAT | 4个字节(32位)单精度浮点数 |
DOUBLE | 8个字节(64位)双精度浮点数 |
DECIMAL | DECIMAL(precision, scale),Hive-0.11.0版本中引入,Hive-0.13.0版本中做了改进 |
NUMERIC | 和DECIMAL一样,从 Hive 3.0.0开始提供支持 |
Hive 是由 Java 编写的,所以 Hive 的基本数据类型都是对应 Java 中的接口
的实现,这些基本的数据类型和 Java 的基本数据类型是一一对应的。
整数类型: TINYINT , SMALLINT , INT/INTEGER , BIGINT 默认情况下,整型型被认为是 INT 型的,当数字超过了 INT 的范围,在这种情况下,它被自动解释执行为 BIGINT ,或者使用以下后缀进行说明。
类型 | 后缀 | 例子 |
TINYINT | Y | 100Y |
SMALLINT | S | 100S |
BIGINT | L | 100L |
Hive 中的 DECIMAL 类型是基于 Java 的 BigDecimal ,它用于表示 Java 中不可
变的任意精度十进制数。
所有常规的数字操作 ( 例如 :+ 、 - 、 * 、 /) 和相关的 UDF( 例如 :Floor 、 Ceil 、 Round
和更多 ) 都使用和支持 Decimal 。
可以将 DECIMAL 和其他数值类型相互转换。 DECIMAL 支持科学和非科学符号表
示。因此,无论数据集是否包含像 4.004E+3( 科学符号 ) 或 4004( 非科学符号 ) 或
两者都有,都可以使用 DECIMAL 类型。
在 Hive0.13 中,用户可以使用语法 DECIMAL(precision, scale) 来指定小数
的位数和精度来创建具有 DECIMAL 数据类型的表。
如果没有指定小数的位数,则默认为 0( 没有小数位数 ) 。如果没有指定精
度,则默认为 10 。
DECIMAL 类型为浮点数提供了比 Double 更加精确的值和更大的范围。
DECIMAL 数据类型存储数字值的精确表示,而双数据类型只是存储非常接近数值的近似。 DECIMAL 类型被使用在一些 DOUBLE 类型的近似值精度不够的环境
中,例如金融应用程序,等于和不等校验和舍入操作,需要使用 DECIMAL 类型。它们可以处理 DOUBLE 范围之外的数字 ( 大约 -10308 到 10308) 或非常接近于
零 (-10-308 到 10-308) 。
类型 | 描述 |
TIMESTAMP | 只是从Hive 0.8.0开始提供支持 |
DATE | 只是从Hive 1.2.0开始提供支持 |
INTERVAL | 只是从Hive 1.2.0开始提供支持 |
支持传统的 UNIX 时间戳和可选的纳秒精度。 Hive 中的 timestamp 与时区无关,
存储为 UNIX 纪元的偏移量。
支持的类型转换为:
● 整型数字类型 : 以秒为单位解释为 UNIX 时间戳。
● 浮点数值类型 : 以秒为单位,以十进制精度解释为 UNIX 时间戳。
● 字符串 :JDBC 兼容 java.sql.Timestamp 格式 "YYYY-MM-DD
HH:MM:SS.fffffffff" (9 位小数精度 ) 。
Hive 提供了用于 timestamp 和时区相互转换的便利 UDF : to_utc_timestamp 和 from_utc_timestamp 。
Timestamp 类型可以使用所有的日期时间 UDF ,如 month 、 day 、 year 等。
文本文件中的 Timestamp 必须使用 yyyy-mm-dd hh:mm:ss[.f...] 的格式,如
果使用其它格式,将它们声明为合适的类型( INT 、 FLOAT 、 STRING 等)并使用 UDF
将它们转换为 Timestamp 。
Hive 中 DATE 类型的值描述了特定的年月日,以 YYYY--MM--DD 格式表示,例
如 2019-03-26 。 DATE 类型不包含时间,所表示日期的范围为
0000--01--01to9999--12--31 。这取决于 Java Date 类型的原始支持。
Date types 只能在 Date, Timestamp, String types 之间转换。
转换类型 | 结果 |
cast(date as date) | 相同的日期值 |
cast(timestamp as date) | 时间戳的年/月/日是根据本地时区确定的,并作为日期值返回。 |
cast(string as date) | 如果字符串是“YYYY-MM-DD”,则返回对应于该年/月/日的日期值。 如果字符串值不匹配此formate,则返回NULL。 |
cast(date as timestamp) | 时间戳值对应于日期值的年/月/日的午夜,基于本地时区。 |
cast(date as string) | 以日期为代表的年/月/日格式为“YYYY-MM-DD”格式的字符串。 |
时间间隔在 1.2.0 之后版本支持,在 2.2.0 版本上进行了扩展。
支持的区间描述 | 样例 | 含义 |
间隔的时间单位: SECOND / MINUTE / DAY / MONTH / YEAR | INTERVAL '1' DAY | an interval of 1 day(s) 间隔1天 |
年到月的时间区间格式:SY-M S: 可选参数 (+/-) Y: 年数 M: 月数 | INTERVAL '1-2' YEAR TO MONTH | shorthand for: INTERVAL '1' YEAR + INTERVAL '2' MONTH 间隔1年2个月 |
天到秒的时间区间格式: SD H:M:S.nnnnnn S: 可选参数 (+/-) D: 天数 H: 小时数 M: 分钟数 S: 秒数 nnnnnn: 可选的纳秒 | INTERVAL '1 2:3:4.000005' DAY | shorthand for: INTERVAL '1' DAY+ INTERVAL '2' HOUR + INTERVAL '3' MINUTE + INTERVAL '4' SECOND + INTERVAL '5' NANO 间隔1天2小时3分4秒5纳秒 |
支持常量级间隔 | INTERVAL 1 DAY | aids query readability/portability |
支持间隔表达式: 这可能涉及其他函数/列。 表达式必须返回一个数字(不可以是浮点数)或字符串。 | INTERVAL (1+dt) DAY | enables dynamic intervals 支持动态间隔 |
可选的使用区间关键字 间隔关键字的用法是强制性的。 间隔的表达式(ex: INTERVAL (1+dt) SECOND) | 1 DAY '1-2' YEAR TO MONTH | INTERVAL 1 DAY INTERVAL '1-2' YEARS TO MONTH |
添加timeunit别名以帮助可移植性/可读性。: SECONDS / MINUTES / HOURS / DAYS / WEEKS / MONTHS / YEARS | 2 SECONDS | 2 SECOND |
Hive 中目前有三种字符串类型: STRING, VARCHAR, CHAR 。
字符串可以用单引号 (') 或双引号 (') 表示。 Hive 使用 c 样式在字符串中转
义。
Hive-0.12.0 版本引入了 VARCHAR 类型, VARCHAR 类型使用长度指示器( 1 到
65355 )创建,长度指示器定义了在字符串中允许的最大字符数量。
如果要转换 / 分配给 varchar 值的字符串值超过 length 说明符,那么字符串
将自动被截断。字符长度由字符串包含的代码点的数量确定。像字符串一样,尾
部空格在 varchar 中很重要,并且会影响比较结果。
非通用 UDFs 不能直接使用 varchar 类型作为输入参数或返回值。可以创建
字符串 UDFs ,而 varchar 值将被转换为 strings 并传递到 UDF 。要直接使用
varchar 参数或返回 varchar 值,请创建 GenericUDF 。
如果基于 reflection-based 方法来获取数据类型信息,则可能存在不支持
varchar 的场景。 这包括一些 SerDe 函数实现。
Char 类型与 Varchar 类似,但它们是固定长度的,这意味着比指定长度值短的部分是用空格填充的,因此在比较时,尾随空格并不重要。最大长度固定在
255 。
boolean 类型,值为 true 与 false 两种类型。
二进制类型,从 Hive0.8.0 开始提供支持。
Hive 与传统的关系型数据库并不相同, Hive 支持以 Java , C 为原型的一些
复杂数据结构。如: Array , Map , Struct , Union 。
ARRAY 类型是由一系列相同数据类型的元素组成,如: ARRAY 。
数组元素可以通过下标来访问,比如有一个 ARRAY 类型的变量 fruits ,它
是由 ['apple','orange','mango'] 组成,那么我们可以通过 fruits[1] 来访问
元素 orange ,因为 ARRAY 类型的下标是从 0 开始的。
从 Hive0.14 起数组允许负值和非常量表达式。
Data_type:primitive_type,array_type,map_type,struct_type,union_type
Primitive_type: TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,
STRING,BINARY,TIMESTAMP,DECIMAL,DATE,VARCHAR,CHAR
MAP 类型是一组无序的 键值对,如:
MAP 。键的类型必须是原子的,值可以是任何类型,
同一个映射的键的类型必须相同,值得类型也必须相同。
MAP 可以通过 key 来访问元素 , 比如” userlist ”是一个 map 类型,其中
username 是 key , password 是 value ;那么我们可以通过 userlist['username']
来得到这个用户对应的 password 。
从 Hive0.14 起 MAP 允许负值和非常量表达式。
STRUCT 类型是一组命名的字段,如:
STRUCT 。字段类型可以包
含不同数据类型的元素。
这些元素可以通过”点语法”的方式来得到所需要的元素,比如 user 是一
个 STRUCT 类型, user ,那么可以通过
user.address 得到这个用户的地址。
UNION 类型包含不同的数据类型,如:
UNIONTYPE 。
在 Hive0.7.0 中引入了 UNIONTYPE 数据类型,但是在 Hive 中对这种类型的
支持仍然不完全。
在包含 UNION TYPE 字段的 JOIN , WHERE , GROUP BY 查询中子句将会失败,
而 Hive 没有定义语法来提取 UNIONTYPE 字段的标记或值。
这就意味着 UNIONTYPE 实际上是在实验观察阶段。
当用户向传统数据库中加载数据的时候,数据库对于存储具有完全的控制能
力,数据库就是 " 守门人 " 。
传统数据库是写入模式,即数据在写入数据库时对模式进行检查。
Hive 对于存储没有这样的控制, Hive 不会在数据加载的时候进行验证,而
是在查询的时候进行,也就是读时模式。
如果记录中的字段个数或者字段类型不匹配的话,那么用户会在查询结果中
看到多个 null 值。
Create table IF NOT EXISTS users (
XM string,
NL int,
XH ARRAY ,
CJ MAP ,
ZZ STRUCT ,
SR date,
SFSC BOOLEAN,
SJ TIMESTAMP
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '_'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞0
添加新评论0 条评论