1. 基本数据类型
Hive数据类型 | 对应Java数据类型 | 长度 | ?例子 | TINYINT | byte | 1byte有符号整数(-128 ~ 127) | 5 | SMALINT | short? | 2byte有符号整数(-32,768 ~ 32,767) | 5 | INT | int | 4byte有符号整数(-2,147,483,648 ~ 2,147,483,647) | 55 | BIGINT | long | 8byte有符号整数(-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807) | 5 | BOOLEAN | boolean | 布尔类型,true或者false | TRUE/FALSE | FLOAT | float | 单精度浮点数 | 3.14159 | DOUBLE | double | 双精度浮点数 | 3.141592653 | STRING | string | 字符串类型,可以使用单引号或者双引号 | 'hello world'或"hello world" | TIMESTAMP | 时间类型 | unix | 1628664897605 | BINARY | 字节数组 | | | DECIMAL | | 从Hive0.11.0开始支持 | DECIMAL(9, 7) | | | | | | | | |
备注:对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储2GB的字符数。
2. 复杂数据类型
数据类型 | 语法示例 | 描述 | MAP | MAP<STRING,FLOAT> | MAP包含key->value键值对,可以通过key来访问元素。比如”userlist”是一个map类型,其中username是key,password是value;那么我们可以通过userlist['username']来得到这个用户对应的password; | ARRAY | ARRAY<STRING> | ARRAY类型是由一系列相同数据类型的元素组成,这些元素可以通过下标来访问。比如有一个ARRAY类型的变量fruits,它是由['apple','orange','mango']组成,那么我们可以通过fruits[1]来访问元素orange,因为ARRAY类型的下标是从0开始的; | STRUCT | STRUCT<CITY:STRING, AREA:STRING, STREET:STRING, NUMBER:INT> | STRUCT可以包含不同数据类型的元素。这些元素可以通过”点语法”的方式来得到所需要的元素,比如user是一个STRUCT类型,那么可以通过user.address得到这个用户的地址。 | UNION | | UNIONTYPE,他是从Hive 0.7.0开始支持的。 |
建表:
create table if not exists
student(
id INT,
name STRING,
cource ARRAY<STRING>,
body MAP<STRING,FLOAT>,
address STRUCT<CITY:STRING,AREA:STRING,STREET:STRING,NUMBER:INT>
)
row format delimited fields terminated by ','
COLLECTION ITEMS TERMINATED BY '_'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
load data local inpath '/home/pro/student.text' into table student;
select * from student;
- 建表时使用?
STORED AS? 子句指定文件存储的格式,该子句表示了该表是以何种文件形式存储在文件系统。 - 数据格式:数据存储在文本文件中,需要按照一定的格式区分行和列并且向Hive指明,Hive才能将其识别,常见的格式有CSV(逗号分隔)和TSV(制表符分隔)。
-
row format delimited fields terminated by ',' ?-- 列分隔符 collection items terminated by '_' ? ? ?--MAP STRUCT 和 ARRAY 的分隔符(数据分割符号) map keys terminated by ':' ? ? ? ? ? ? ? ?-- MAP中的key与value的分隔符 lines terminated by '\n'; ? ? ? ? ? ? ? ? ? ?-- 行分隔符 (可以看到,我们定义了三种不同的集合类型字段,并指定了集合类型的分隔符为"_",即struct,array,以及map的不同kv之间用"_"分割,同时定义了map的key和value之间用":"分割。)
1,文文,语文_数学_英语_音乐,Height:165_weight:50,深圳_福田区_益田路_5023
2,毛毛,语文_数学_英语_体育,Height:175_weight:60,深圳_南山区_深南大道_9037
3,超超,语文_数学_英语_美术,Height:170_weight:60,深圳_罗湖区_深南东路_5002
select * from student;
3. 数据类型转换
Hive的原子数据类型是可以进行隐式转换的,类似于Java的类型转换,例如某表达式使用INT类型,TINYINT会自动转换为INT类型,但是Hive不会进行反向转化,例如,某表达式使用TINYINT类型,INT不会自动转换为TINYINT类型,它会返回错误,除非使用CAST操作。
隐式类型转换规则:
下表列出了Hive内置的数据类型之间是否可以进行隐式的转换操作:
| bl | tinyint | si | int | bigint | float | double | dm | string | vc | ts | date | ba |
---|
boolean | true | false | false | false | false | false | false | false | false | false | false | false | false | tinyint | false | true | true | true | true | true | true | true | true | true | false | false | false | smallint | false | false | true | true | true | true | true | true | true | true | false | false | false | int | false | false | false | true | true | true | true | true | true | true | false | false | false | bigint | false | false | false | false | true | true | true | true | true | true | false | false | false | float | false | false | false | false | false | true | true | true | true | true | false | false | false | double | false | false | false | false | false | false | true | true | true | true | false | false | false | decimal | false | false | false | false | false | false | false | true | true | true | false | false | false | string | false | false | false | false | false | false | true | true | true | true | false | false | false | varchar | false | false | false | false | false | false | true | true | true | true | false | false | false | ts | false | false | false | false | false | false | false | false | true | true | true | false | false | date | false | false | false | false | false | false | false | false | true | true | false | true | false | binary | false | false | false | false | false | false | false | false | false | false | false | false | true |
注:由于表格比较大,这里对一些比较长的字符串进行缩写,ts是timestamp的缩写,bl是boolean的缩写,sl是smallint的缩写,dm是decimal的缩写,vc是varchar的缩写,ba是binary的缩写。
- 任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。
- 所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。
- TINYINT、SMALLINT、INT都可以转换为FLOAT。
- BOOLEAN类型不可以转换为任何其它的类型。
使用CAST操作显示进行数据类型转换:
- 例如CAST('1' AS INT)将把字符串'1' 转换成整数1;如果强制类型转换失败,如执行CAST('X' AS INT),表达式返回空值 NULL。
- 对于BINARY类型的数据,只能将BINARY类型的数据转换成STRING类型。如果你确信BINARY类型数据是一个数字类型(a number),这时候你可以利用嵌套的cast操作,比如a是一个BINARY,且它是一个数字类型,那么你可以用下面的查询:
SELECT (cast(cast(a as string) as double)) from src; - 对于Date类型的数据,只能在Date、Timestamp以及String之间进行转换。下表将进行详细的说明:
有效的转换 结果
cast(date as date) 返回date类型
cast(timestamp as date) timestamp中的年/月/日的值是依赖与当地的时区,结果返回date类型
cast(string as date) 如果string是YYYY-MM-DD格式的,则相应的年/月/日的date类型的数据将会返回;但如果string不是YYYY-MM-DD格式的,结果则会返回NULL。
cast(date as timestamp) 基于当地的时区,生成一个对应date的年/月/日的时间戳值
cast(date as string) date所代表的年/月/日时间将会转换成YYYY-MM-DD的字符串。
4. 文件格式
- TEXTFILE //文本,默认值
- SEQUENCEFILE // 二进制序列文件
- RCFILE //列式存储格式文件 Hive0.6以后开始支持
- ORC //列式存储格式文件,比RCFILE有更高的压缩比和读写效率,Hive0.11以后开始支持
- PARQUET //列式存储格式文件,Hive0.13以后开始支持
|