对于 Hive 的 String 类型相当于数据库的 varchar 类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储 2GB 的字符数。
Hive 有三种复杂数据类型 ARRAY、MAP 和 STRUCT。ARRAY 和 MAP 与 Java 中的Array 和 Map 类似,而 STRUCT 与 C 语言中的 Struct 类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。
Hive 的原子数据类型是可以进行隐式转换的,类似于 Java 的类型转换,例如某表达式使用 INT 类型,TINYINT 会自动转换为 INT 类型,但是 Hive 不会进行反向转化,例如,某表达式使用 TINYINT 类型,INT 不会自动转换为 TINYINT 类型,它会返回错误,除非使用 CAST 操作。
1,隐式类型转换规则如下
(1)任何整数类型都可以隐式地转换为一个范围更广的类型,如 TINYINT 可以转换成 INT,INT 可以转换成 BIGINT。
(2)所有整数类型、FLOAT 和 STRING 类型都可以隐式地转换成 DOUBLE。
(3)TINYINT、SMALLINT、INT 都可以转换为 FLOAT。
(4)BOOLEAN 类型不可以转换为任何其它的类型。
2,可以使用 CAST 操作显示进行数据类型转换
cast(‘1’ as int) 把字符串‘1’转换成了整数1.
cast(‘x’ as int) 强制类型转换失败,会返回空值null
创建数据库:create database db_hive;
创建数据库(避免已存在错误):create database if not exists db_hive;
创建数据库指定存放位置:create database db_hive location ‘/db_hive2.db’;
显示数据库:show databases;
过滤显示数据库:show databases like ‘db_hive*’;
显示数据库信息:desc database db_hive;
显示数据库详细信息:desc database extended db_hive;
切换当前数据库:use db_hive;
修改数据库:alter database hive set dbproperties(‘createtime’ = ‘20170830’ );
删除空数据库:drop database db_hive2;
删除数据库(避免不存在):drop database is exists db_hive2;
如果数据库不为空,采用cascade强制删除:drop database db_hive cascade;
建表语句:
create table 表名
(1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
(2)EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
(3)COMMENT:为表和列添加注释。
(4)PARTITIONED BY 创建分区表
(5)CLUSTERED BY 创建分桶表
(6)SORTED BY 不常用
(7)ROW FORMAT
DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS
TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value,
property_name=property_value, …)]
用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive 通过 SerDe确定表的具体的列的数据。
SerDe 是 Serialize/Deserilize 的简称,目的是用于序列化和反序列化。
(8)STORED AS 指定存储文件类型
常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。
(9)LOCATION :指定表在 HDFS 上的存储位置。
(10)LIKE 允许用户复制现有的表结构,但是不复制数据。
默认创建的表都是所谓的管理表,有时也被称为内部表。
当我们删除一个管理表时,Hive 也会删除这个表中数据
--普通创建表
create table if not exists student2(
id int,name string)
row format delimited fields terminated by '\t'
stored as textfile ---指定存储文件类型
location '/user/hive/warehouse/student2'; --指定表在 HDFS 上的存储位置
因为表是外部表,所以 Hive 并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。
外部表与管理表:
每天收集到的日志表流入HDFS文件,在外部表上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过select+insert进入内部表
向外部表中导入数据:
load data local inpath ‘文件’ into table default.dept;
desc formatted dept;
查询表的类型:desc formatted student2;
修改内部表student2为外部表:alter table student2 set tblproperties(‘EXTERNAL’ = ‘TRUE’);
查询表的类型:desc formatted student2;
修改外表student2为内部表:alter table student2 set tblproperties(‘EXTERNAL’ = ‘FALSE’);
查询表的类型:desc formatted student2;
分区表对应hive中的一个独立的文件夹,该文件夹下是该分区所有的数据文件。
HIve中分区就是分目录。把一个大的数据集根据业务需要分割成小的数据集,在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。
2,创建分区表语法
create table 表名(deptno int,
dname string,
loc string)
partition by (month string)
row format delimited fields terminated by '\t';
3,加载数据到分区表中
load data local inpath '/opt/module/datas/dept.txt' into table default.dept_partition
partition(month='201709');
load data local inpath '/opt/module/datas/dept.txt' into table default.dept_partition
partition(month='201708');
4,查询分区表中数据
select * from dept_partition where month='201709';
5,增加分区add partition
alter table dept_partition add partition(month='201706') ;
同时创建多个分区
alter table 表名 add partition(month='201706') partition(month='201705');
6,删除分区
alter table dept_partition drop partition (month='201704');
删除多个分区
alter table dept_partition drop partition (month='201705'), partition (month='201706');
7,查看分区表有多少个分区
show partitions dept_partition;
8,查看分区表结构
desc formatted dept_partition;
1,创建二级分区表
create table dept_partition2(deptno int, dname string, loc string
)
partitioned by (month string, day string)
row format delimited fields terminated by '\t';
2,加载数据到二级分区表中
load data local inpath '/opt/module/datas/dept.txt' into table
default.dept_partition2 partition(month='201709', day='13');
3,查询
select * from dept_partition2 where month='201709' and day='13';
4,把数据直接上传到分区目录上,让分区表和数据产生关联的三种方式
alter table 表名 rename to 新表名
alter table dept_partition2 rename to dept_partition3;
更新列:
alter table 表名 change 原列名 新列名 column_type [COMMENT col_comment] [FIRST|AFTER column_name]
增加和替换列:
ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], …)
更新change、增加add、替换replace
1,查询表结构
desc 表名 ;
2,添加列
alter table 表名 add columns(列名 列类型);
3,查询表结构
desc 表名 ;
4,更新列
alter table 表名 add columns 列名 列类型 ;
5,替换列
alter table dept_partition replace columns(deptno string, dname string, loc string);
drop table 表名;