Hive数据类型

1. Hive数据类型

Hive支持原始数据类型和复杂类型,原始类型包括数值型,Boolean,字符串,时间戳。复杂类型包括数组,map,struct。下面是Hive数据类型的一个总结:

分类类型描述字面量示例
原始类型BOOLEANtrue/falseTRUE
TINYINT1字节的有符号整数 -128~1271Y
SMALLINT2个字节的有符号整数,-32768~327671S
INT4个字节的带符号整数1
BIGINT8字节带符号整数1L
FLOAT4字节单精度浮点数1.0
DOUBLE8字节双精度浮点数1.0
DEICIMAL任意精度的带符号小数1.0
STRING字符串,变长“a”,’b’
VARCHAR变长字符串“a”,’b’
CHAR固定长度字符串“a”,’b’
BINARY字节数组无法表示
TIMESTAMP时间戳,纳秒精度122327493795
DATE日期‘2016-03-29’
复杂类型ARRAY有序的的同类型的集合array(1,2)
MAPkey-value,key必须为原始类型,value可以任意类型map(‘a’,1,’b’,2)
STRUCT字段集合,类型可以不同struct(‘1’,1,1.0), named_stract(‘col1’,’1’,’col2’,1,’clo3’,1.0)
UNION在有限取值范围内的一个值create_union(1,’a’,63)

2. 基本类型

HQL的基本类型和Java的基本类型很接近,虽然受到一些MySQL命名的影响。

2.1 整数类型

Hive有4种带符号的整数类型:TINYINT,SMALLINT,INT,BIGINT,分别对应Java中的byte,short,int,long。字节长度分别为1,2,4,8字节。在使用整数字面量时,默认情况下为INT,如果要声明为其他类型,通过后缀来标识:

类型后缀例子
TINYINTY100Y
SMALLINTS100S
BIGINTL100L

2.2 小数

浮点类型包括FLOAT和DOUBLE两种,对应到Java的float和double,分别为32位和64位浮点数。DECIMAL用于表示任意精度的小树,类似于Java的BigDecimal,通常在货币当中使用。例如DECIMAL(5,2)用于存储-999.99到999.99的数字,省略掉小数位,DECIAML(5)表示-99999到99999的数字。DECIMAL则等同于DECIMAL(10,0)。小数点左边允许的最大位数为38位。

数值类型总结如下表:

Numeric-Data-types.jpg-77.3kB

2.3 文本类型

Hive有3种类型用于存储字文本。STRING存储变长的文本,对长度没有限制。理论上将STRING可以存储的大小为2GB,但是存储特别大的对象时效率可能受到影响,可以考虑使用Sqoop提供的大对象支持。VARCHAR与STRING类似,但是长度上只允许在1-65355之间。例如VARCHAR(100).CHAR则用固定长度来存储数据。

String-data-types.jpg-66.6kB

2.4 布尔及二进制

BOOLEAN表示二元的true或false。
BINARY用于存储变长的二进制数据。

2.5 时间类型

TIMESTAMP则存储纳秒级别的时间戳,同时Hive提供了一些内置函数用于在TIMESTAMP与Unix时间戳(秒)和字符串之间做转换。例如:

cast(date as date)
cast(timestamp as date)
cast(string as date)
cast(date as string)

时间戳类型的数据不包含任务的时区信息,但是to_utc_timestampfrom_utc_timestamp函数可以用于时区转换。DATE类型则表示日期,对应年月日三个部分。

3. 类型转换

Hive的类型层次中,可以根据需要进行隐式的类型转换,例如TINYINT与INT相加,则会将TINYINT转化成INT然后INT做加法。隐式转换的规则大致可以归纳如下:

  • 任意数值类型都可以转换成更宽的数据类型(不会导致精度丢失)或者文本类型。

  • 所有的文本类型都可以隐式地转换成另一种文本类型。也可以被转换成DOUBLE或者DECIMAL,转换失败时抛出异常。

  • BOOLEAN不能做任何的类型转换。

  • 时间戳和日期可以隐式地转换成文本类型。

也可以使用CAST进行显式的类型转换,例如CAST('1' as INT),如果转换失败,CAST返回NULL。

4. 复杂类型

Hive有4种复杂类型的数据结构:ARRAY,MAP,STRUCT,UNION。

4.1 ARRAY和MAP

ARRAY和MAP类型与Java中的数据和映射表。数组的类型声明格式为ARRAY<data_type>,元素访问通过0开始的下标,例如arrays[1]访问第二个元素。
MAP通过MAP<primitive_type,data_type>来声明,key只能是基本类型,值可以是任意类型。map的元素访问则使用[],例如map['key1'].

4.2 STRUCT

STRUCT则封装一组有名字的字段(named filed),其类型可以是任意的基本类型,元素的访问使用点号。

4.3 UNION

UNION则类似于C语言中的UNION结构,在给定的任何一个时间点,UNION类型可以保存指定数据类型中的任意一种。类型声明语法为UNIONTYPE<data_type,data_type,…>。每个UNION类型的值都通过一个整数来表示其类型,这个整数位声明时的索引,从0开始。例如:

CREATE TABLE union_test(foo UNIONTYPE<int,double,array<string>,strucy<a:int,b:string>>);

foo的一些取值如下:

{0:1}
{1:2.0}
{2:["three" , "four"]}
{3:["a":5,b:"five"]}
{0:9}

其中冒号左边的整数代表数据类型,必须在预先定义的范围类,通过0开始的下标表示。冒号右边是该类型的取值。

下面的这个CRATE语句用到了这4中复杂类型:

CREATE TABLE complex (
  c1 ARRAY<INT>,
  c2 MAP<STRING,INT>,
  c3 STRUCT<a:STRING,b:INT,c:DOUBLE>,
  c4 UNIONTYPE<STRING,INT>
);

通过下面的SELECT语句查询相应的数据:

SELECT c1[0] , c2['b'],c3.c , c4 FROM complex

结果类似:

1 2 1.0 {1:63}
### Hive 基本数据类型的定义与使用 Hive 是一种基于 Hadoop 的数据仓库工具,用于处理大规模结构化数据。它通过类似于 SQL 的查询语言——HiveQL 来操作和分析数据。为了有效地设计表结构并确保数据的有效性和完整性,理解 Hive 中的基本数据类型是非常重要的。 以下是 Hive 支持的主要基本数据类型及其特点: #### 1. **字符串 (String)** `string` 类型表示可变长度的字符序列。它是 Hive 中最常用的数据类型之一,适用于存储文本信息。该类型不区分大小写,并且可以包含任意 Unicode 字符[^2]。 ```sql CREATE TABLE example_table ( name STRING -- 存储姓名字段 ); ``` --- #### 2. **整数类型** Hive 提供了几种不同范围的整数类型,具体如下: - `tinyint`: 占用 1 个字节(8 位二进制),取值范围为 -128 到 127。 - `smallint`: 占用 2 个字节(16 位二进制),取值范围为 -32,768 到 32,767。 - `int`: 占用 4 个字节(32 位二进制),取值范围为 -2,147,483,648 到 2,147,483,647。 - `bigint`: 占用 8 个字节(64 位二进制),取值范围为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。 每种整数类型的选择取决于实际需求中的数值范围和性能考虑。 ```sql CREATE TABLE number_example ( age TINYINT, height SMALLINT, population INT, total BIGINT ); ``` --- #### 3. **浮点数类型** Hive 还提供了两种浮点数类型来存储近似值: - `float`: 单精度浮点数,占用 4 个字节。 - `double`: 双精度浮点数,占用 8 个字节,能够存储更大范围的数值。 需要注意的是,在涉及精确计算的应用场景下应谨慎使用浮点数类型,因为它们可能会引入舍入误差。 ```sql CREATE TABLE floating_point_example ( pi FLOAT, gravity DOUBLE ); ``` --- #### 4. **布尔类型 (Boolean)** `boolean` 数据类型仅允许两个可能的值:`TRUE` 或 `FALSE`。这种类型通常用于逻辑判断或标志位的设计。 ```sql CREATE TABLE flag_example ( is_active BOOLEAN ); ``` --- #### 5. **日期时间类型** 虽然未在引用中提及,但值得一提的是,Hive 同样支持一些常见的日期时间类型,例如 `timestamp` 和 `date`。这些类型有助于记录事件发生的时间戳或其他时间敏感的信息[^1]。 ```sql CREATE TABLE time_example ( event_time TIMESTAMP, created_date DATE ); ``` --- ### 使用教程总结 当创建 Hive 表时,开发者可以根据业务需求选择合适的数据类型。例如: - 如果需要保存简单的标签或者描述性文字,则可以选择 `STRING`; - 对于计数器或者其他有限范围内的数字变量,推荐选用较小尺寸的整数类型如 `TINYINT` 或者 `SMALLINT`; - 需要高精度科学运算的地方则应该采用双精度浮点数即 `DOUBLE`。 此外,在实际应用过程中还需要注意不同类型之间的转换规则以及潜在溢出风险等问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值