目录
创建数据库
create database myhive;
如果需要指定数据库创建在hdfs中的位置,可以使用以下代码
create database myhive location '/myhive';
这里的/myhive是绝对路径,默认路径应该为hdfs下的/user/hive/warehouse
删除数据库
drop database myhive;
但是如果被删除数据库不为空,会报错,可以使用以下代码强制删除(删除后对应在hdfs中文件也会删除)
drop database myhive cascade;
创建内部表(创建外部表以及一些高级用法在文章后面逐一讲解)
create table [if not exists] mytable(id int, name string);
创建表时自定义分隔符
create table mytable(id int, name string) row format delimited fields terminated by '\t';
自定义分隔符在查看hdfs文件内容时有区别,展示如下(student1为默认,student2为自定义)
外部表创建
create external mytable(id int, name string) row format delimited fields terminated by '\t' location 'path';
这里的path为自定义在hdfs上的目录,此处演示代码是先创建外部表,再移动数据到path里面去
完成表的创建之后,自己在Linux创建txt文件,然后使用
hadoop fs -put txt文件的路径 path
然后在查询,就可以看到结果
select * from mytable;
当然也可以先有数据,存在hdfs中,再在创建表的时候指明path,也可以创建外部表。
显然,元数据与外部表相互独立,所以当我们删除外部表时,元数据并不会受到影响,这一点与内部表不同(内部表删除表,元数据也会删除)。
查询表类型
desc formatted mytable;
内部表:
外部表
内、外部表类型转化
内部表转化为外部表
alter table mytable set tblproperties('EXTERNAL'='TRUE');
外部转内部将TRUE改为FALSE即可,区分大小写
数据导入
load data [local] inpath 'path' [overwrite] into table mytable;
其中【】包括的内容可有可没有。分为以下情况
1、如果数据在Linux本地上传,加上【local】
2、如果数据在hdfs上传,不用加【local】
3、如果需要覆盖表中原有内容,加上【overwrite】,否则不加
注意,hdfs导入数据相当于是移动数据到表的存储位置,导入后数据在path中就没有了,需要去表存储的位置找。
数据导出
insert overwrite [local] directory 'path' [row format delimited fields terminated by '\t']
select * from mytable;
path是导出的文件夹名字,导出文件夹有类似下图的文件,可以cat查看
分区表
create table mytable(id string) partitioned by (分区列 列类型) row format delimited fields terminated by '\t';
创建语句中(分区列,列类型可以填多个),填一个是单分区表,多个为多分区表,例如(year string, month string),分区列在后续加载数据中必须写全
创建好之后加载数据
load data inpath 'path' into table mytable partition(year='自定义',month='自定义');
分桶表
首先需要开启分桶的自动化(自动匹配reduce task数量=分桶数量)
set hive.enforce.bucketing=true;
分桶表创建语句
create table mytable(id string, name string) clustered by(id) into 3 buckets row format delimited fields terminated by '\t' ;
分桶表不能使用load data加载数据,因为分桶表需要进行hash取模的计算,load data不能启动mapreduce计算,因此应该使用insert select方法加载数据,该方法需要将数据加载到一个临时表,再通过insert select加载到分桶表。
create table mytable_temp(id string, name string) row format delimited fields terminated by '\t' ;
load data inpath 'path' into table mytable_temp;
insert overwrite table mytable select * from mytable_temp cluster by(id);