1、HIve基本数据类型
Hive 数据类型 | 长度 | 例子 |
TINYINT | 1byte 有符号整数 | 20 |
SMALINT | 2byte 有符号整数 | 20 |
INT | 4byte 有符号整数 | 20 |
BIGINT | 8byte 有符号整数 | 20 |
BOOLEAN | 布尔类型, true 或者 false | TRUE FALSE |
FLOAT | 单精度浮点数 | 3.14159 |
DOUBLE | 双精度浮点数 | 3.14159 |
STRING | 字符系列。可以指定 字符集。可以使用单 引号或者双引号。 | ‘now is the time’ “for all good men” |
TIMESTAMP | 时间类型 | |
BINARY | 字节数组 | |
对于 Hive 的 String 类型相当于数据库的 varchar 类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储 2GB 的字符数。
2、集合数据类型
数据类型 | 描述 | 语法示例 |
STRUCT | 和 c 语言中的 struct 类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是 STRUCT{first STRING, lastSTRING},那么第 1 个元素可以通过字段.first 来引用。 | struct() |
MAP | MAP 是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是 MAP,其中键 ->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素 | map() |
ARRAY | 数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第 2 个元素可以通过数组名[1]进行引用。 | Array() |
Hive 有三种复杂数据类型 ARRAY、 MAP 和 STRUCT。 ARRAY 和 MAP 与 Java 中的 Array 和 Map 类似,而 STRUCT 与 C 语言中的 Struct 类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。
3、简单的hive sql语句
#查询数据库
show databases;
#查询表
show tables;
#使用数据库
use database_name;
#查看表结构
desc table_name;
#删除表
drop table table_name;
4、创建表
格式:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
# 字段解释:
[external] # 申明是否为外部表
[if not exists] # 如果表存在,则不创建了
[(col_name data_type [COMMENT col_comment], ...)] # 分别是 字段名,字段类型,字段注释
[COMMENT table_comment] # 放在()后面,是表注释
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] # 建立分区,()里是字段名,字段类型,字段注释,分区里的字段不能包含在字段声明区。
[CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] # 在clustered by 里的字段上建立 num_buckets个桶,记录是由 sorted by里的字段排序的。
[ROW FORMAT row_format] # 指定分隔符,可以是以下几个:
: DELIMITED [FIELDS TERMINATED BY char]
[COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char]
[STORED AS file_format] # 指定load文件的类型,分为:
textfile 是 纯文本文件
sequence 是 压缩文件
[LOCATION hdfs_path] # 向表里加载数据,hdfs_path是一个hdfs上的目录,不能是文件,hive会依据默认配置的hdfs路径,自动将整个目录下的文件都加载到表中。
2)案例实操
(1)普通创建表
|
(2)根据查询结果创建表(查询的结果会添加到新创建的表中)
|
(3)根据已经存在的表结构创建表
|
(4)查询表的类型
hive (default)> desc formatted student2;
Table Type: MANAGED_TABLE
5、 外部表
1)理论
因为表是外部表,所有 Hive 并非认为其完全拥有这份数据。 删除该表并不会删除掉这
份数据,不过描述表的元数据信息会被删除掉。
2)管理表和外部表的使用场景:
每天将收集到的网站日志定期流入 HDFS 文本文件。在外部表(原始日志表)的基础
上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过 SELECT+INSERT
进入内部表
6、使用复杂类型创建表
create external table if not exists T2(
id int,
course array<string>,
score map<string,int>
)
row format
delimited fields terminated by ','
collection items terminated by '|'
map keys terminated by ':'
stored as textfile;
# 数据文件内容
1001,语文|数学|英语,语文|56,语文:102|数学:2033|英语:30
1002,语文|数学|英语,语文|156,语文:120|数学:2033|英语:30
1003,语文|数学|英语,语文|1156,语文:210|数学:3320|英语:30
1004,语文|数学|英语,语文|1156,语文:2210|数学:203|英语:30
1005,语文|数学|英语,语文|5116,语文:22210|数学:230|英语:30
# 导入数据文件
load data local inpath '/home/datanode/hiveTest/test01' overwrite into table t2;
创建一个带分区的内部表
create table if not exists T3(
id int,
name string
)
partitioned by (classid int)
row format
delimited fields terminated by ','
stored as textfile;
创建一个带桶的内部表
create table T4(
id int ,
name string,
sex string,
age int
)
partitioned by (city string)
clustered by(age) sorted by(name) into 5 buckets
row format
delimited fields terminated by ','
stored as textfile;