Hadoop系列-Hive数据库常见SQL命令

前几天写的Hive的安装,这个是Hadoop的一种数据仓库,支持多种文件格式可以直接导入数据库的操作,十分方便。今天把刚学习的Hive的常用数据库SQL命令整理出来,大家共同学习,如果有什么问题大家在评论来问我。

一、数据库相关命令

--默认创建数据,路径默认放到/user/hive/warehouse中
create database if not exists myhive;
--指定目录创建数据库
create database myhive2 location '/myhive2';
--查看数据库信息
desc database myhive;
OK
myhive      hdfs://master:9000/user/hive/warehouse/myhive.db    root    USER    
Time taken: 0.026 seconds, Fetched: 1 row(s)
--删除数据库,加上cascade的话连表一起删除,不带会删除失败报错
drop database myhive cascade;

二、创建内部表

--建表,external是外部表,不带的是内部表,表示不对外开放的表也就是管理表,下面的是内部表
CREATE TABLE `T_TEST_HIVE` (
   `ID` BIGINT COMMENT 'PRIMARY KEY',
   `TEST_VARCHAR` VARCHAR(50) ,
   `TEST_BIGINT` BIGINT,
   `TEST_DATETIME` TIMESTAMP
);
--查看database下的所有表
show tables;
--查看表
desc T_TEST_HIVE;
--查看表详细信息
desc formatted T_TEST_HIVE;
--删除表
drop table T_TEST_HIVE;
--插入数据,实际下面的方式不推荐使用,因为每次操作都会创建一个文件,比如下面两个SQL实际上写入了两个文件
insert into T_TEST_HIVE values (1,'nnn',1,null);
insert into T_TEST_HIVE values (2,'nnn2',2,null);
--这个时候可以到http://localhost:50070/explorer.html#/查看文件
--通过haddop查看文件命令可以看到具体的文件内容,其中每条数据一个文件
hadoop fs -cat /user/hive/warehouse/myhive.db/t_test_hive/000000_0
hadoop fs -cat /user/hive/warehouse/myhive.db/t_test_hive/000000_0_copy_1
--通过load读取本地数据文件(linux文件)数据导入
CREATE TABLE test (
   id int,name string
) row format delimited fields terminated by '\t';
--编写测试数据文件,注意数据中间不是空格,而是type健,建议vi之后,手动敲一下
vi /usr/local/apache-hive-1.2.2-bin/test.txt
1   zhangsan
2   lisi
--编辑完成后,通过load命令导入
load data local inpath '/usr/local/apache-hive-1.2.2-bin/test.txt' into table test;
--这种操作实际上是直接把这个txt直接copy到hdfs对应的表目录下了,可以在hdfs上看到这个txt文件

--通过load读取HDFS数据文件数据导入
CREATE TABLE test2 (
   id int,name string
) row format delimited fields terminated by '\t';
--编写测试数据文件,注意数据中间不是空格,而是type健,建议vi之后,手动敲一下
vi /usr/local/apache-hive-1.2.2-bin/test2.txt
3   zhao3
4   wu4
--通过命令上传到hdfs中
hadoop fs -mkdir -p /hivedatas
hadoop fs -put /usr/local/apache-hive-1.2.2-bin/test2.txt /hivedatas/
load data inpath '/hivedatas/test2.txt' into table test2;
--导入完成后,会发现/hivedatas下的文件被移动到了/user/hive/warehouse/myhive.db/test2下,也就是直接到了表目录下

三、创建外部表

--实际上是可以共享的,比较安全,另外一般指定存储位置
CREATE external TABLE test_external (
   id int,name string,birth string,sex string
) row format delimited fields terminated by '\t' location '/hive_table/test_external';
 
CREATE external TABLE test_external2 (
   id int,name string
) row format delimited fields terminated by '\t' location '/hive_table/test_external2';
--编辑好文件数据,通过load导入
load data local inpath '/usr/local/apache-hive-1.2.2-bin/test_external.txt' into table test_external;
--注意增加两个一个overwrite参数,表示会覆盖原有数据
load data local inpath '/usr/local/apache-hive-1.2.2-bin/test_external2.txt' overwrite into table test_external2;
select * from test_external;
--可以看到数据
OK
1   jj  dd  s
2   ee  aa  oo
3   sdsd    sd  asd
--可以退出hive查看数据文件
hadoop fs -cat /hive_table/test_external/test_external.txt
--可以看到有内容输出
1   jj  dd  s
2   ee  aa  oo
3   sdsd    sd  asd
--这个时候重新进入hive删除下表
drop table test_external;
--再次推出hive,查看文件
hadoop fs -cat /hive_table/test_external/test_external.txt
--可以看到有内容输出,说明表文件没有删除
1   jj  dd  s
2   ee  aa  oo
3   sdsd    sd  asd
--重新建立表
CREATE external TABLE test_external (
   id int,name string,birth string,sex string
) row format delimited fields terminated by '\t' location '/hive_table/test_external';
再次查看表数据
select * from test_external;
--可以看到数据,说明当drop表后,文件并没有删除,重新建立表指定同样的文件后,表数据就恢复了
OK
1   jj  dd  s
2   ee  aa  oo
3   sdsd    sd  asd

四、一级分区表
其实就是把不同的数据放在不同的目录下

--准备数据文件并保存
vi /usr/local/apache-hive-1.2.2-bin/test_partition.txt
1   jj  100
2   ee  99
3   sdsd    98
--进入HIVE,建表SQL,一级分区表,按照月分区
CREATE TABLE test_partition (
   id int,name string,score int
) partitioned by (month string) row format delimited fields terminated by '\t';
--导入数据到month 202203,202204分区
load data local inpath '/usr/local/apache-hive-1.2.2-bin/test_partition.txt' into table test_partition partition (month='202203');
load data local inpath '/usr/local/apache-hive-1.2.2-bin/test_partition.txt' into table test_partition partition (month='202204');
--通过SQL语句查看
select * from test_partition;
OK
1   jj  100 202203
2   ee  99  202203
3   sdsd    98  202203
1   jj  100 202204
2   ee  99  202204
3   sdsd    98  202204
Time taken: 0.118 seconds, Fetched: 6 row(s)
--单独查询一个分区
select * from test_partition where month = '202203';
OK
1   jj  100 202203
2   ee  99  202203
3   sdsd    98  202203
Time taken: 0.511 seconds, Fetched: 3 row(s)
--同时查询两个分区,但是这种涉及到复杂文件计算了,效率很低,不推荐这种查询
select * from test_partition where month = '202203' union all select * from test_partition where month = '202204';
OK
1   jj  100 202203
1   jj  100 202204
2   ee  99  202203
2   ee  99  202204
3   sdsd    98  202203
3   sdsd    98  202204
Time taken: 51.013 seconds, Fetched: 6 row(s)
--退出Hive后,通过cat命令看到hadoop存在了以下两个文件
hadoop fs -cat /user/hive/warehouse/myhive.db/test_partition/month=202203/test_partition.txt
--输出
1   jj  100
2   ee  99
3   sdsd    98
hadoop fs -cat /user/hive/warehouse/myhive.db/test_partition/month=202204/test_partition.txt
--输出
1   jj  100
2   ee  99
3   sdsd    98

五、多级分区表
就是通过多个字段设置分区

--进入HIVE,建表SQL,多级分区表,按照月分区
CREATE TABLE test_partition2 (
   id int,name string,score int
) partitioned by (year string,month string,day string) row format delimited fields terminated by '\t';
--导入数据到分区数据
load data local inpath '/usr/local/apache-hive-1.2.2-bin/test_partition.txt' into table test_partition2
partition (year='2022',month='03',day='11');
load data local inpath '/usr/local/apache-hive-1.2.2-bin/test_partition.txt' into table test_partition2
partition (year='2022',month='03',day='12');
load data local inpath '/usr/local/apache-hive-1.2.2-bin/test_partition.txt' into table test_partition2
partition (year='2022',month='04',day='11');
--查询SQL
select * from test_partition2;
OK
1   jj  100 2022    03  11
2   ee  99  2022    03  11
3   sdsd    98  2022    03  11
Time taken: 0.107 seconds, Fetched: 3 row(s)
--也可以指定分区查询
select * from test_partition2 where year = '2022';
OK
1   jj  100 2022    03  11
2   ee  99  2022    03  11
3   sdsd    98  2022    03  11
1   jj  100 2022    03  12
2   ee  99  2022    03  12
3   sdsd    98  2022    03  12
1   jj  100 2022    04  11
2   ee  99  2022    04  11
3   sdsd    98  2022    04  11
select * from test_partition2 where day = '11';
OK
1   jj  100 2022    03  11
2   ee  99  2022    03  11
3   sdsd    98  2022    03  11
1   jj  100 2022    04  11
2   ee  99  2022    04  11
3   sdsd    98  2022    04  11
--退出Hive后,通过cat命令看到hadoop存在了以下目录的文件
hadoop fs -cat /user/hive/warehouse/myhive.db/test_partition2/year=2022/month=03/day=11/test_partition.txt
1   jj  100
2   ee  99
3   sdsd    98
hadoop fs -cat /user/hive/warehouse/myhive.db/test_partition2/year=2022/month=03/day=12/test_partition.txt
1   jj  100
2   ee  99
3   sdsd    98
hadoop fs -cat /user/hive/warehouse/myhive.db/test_partition2/year=2022/month=04/day=11/test_partition.txt
1   jj  100
2   ee  99
3   sdsd    98

六、分区表的其他操作

--查看分区
show partitions test_partition;
--输出
OK
month=202203
month=202204
Time taken: 0.123 seconds, Fetched: 2 row(s)
--添加分区
alter table test_partition add partition(month='202205');
alter table test_partition add partition(month='202206') partition(month='202207');
--再次查看分区
show partitions test_partition;
OK
month=202203
month=202204
month=202205
month=202206
month=202207
Time taken: 0.103 seconds, Fetched: 5 row(s)
--删除分区
alter table test_partition drop partition(month='202207');
--再次查看分区
show partitions test_partition;
OK
month=202203
month=202204
month=202205
month=202206
Time taken: 0.124 seconds, Fetched: 4 row(s)
--查看多级分区
show partitions test_partition2;
OK
year=2022/month=03/day=11
year=2022/month=03/day=12
year=2022/month=04/day=11
Time taken: 0.115 seconds, Fetched: 3 row(s)
--添加多级分区
alter table test_partition2 add partition(year='2022',month='03',day='13');
--再次查看多级分区
show partitions test_partition2;
OK
year=2022/month=03/day=11
year=2022/month=03/day=12
year=2022/month=03/day=13
year=2022/month=04/day=11
Time taken: 0.109 seconds, Fetched: 4 row(s)

谢各位的阅读,谢谢您动动手指点赞,万分感谢各位。另外以下是我之前写过的文章,感兴趣的可以点进去继续阅读。

历史文章

Hadoop系列-入门安装
Hadoop系列-HDFS命令
Hadoop系列-Hive安装
Hadoop系列-Hive数据库常见SQL命令
Hadoop系列-HBase数据库
Hadoop系列-HBase数据库(二)
Hadoop系列-HBase数据库JAVA篇
Hadoop系列-Spark安装以及HelloWorld
JAVA面试汇总(五)数据库(一)
JAVA面试汇总(五)数据库(二)
JAVA面试汇总(五)数据库(三)
JAVA面试汇总(四)JVM(一)
JAVA面试汇总(四)JVM(二)
JAVA面试汇总(四)JVM(三)
JAVA面试汇总(三)集合(一)
JAVA面试汇总(三)集合(二)
JAVA面试汇总(三)集合(三)
JAVA面试汇总(三)集合(四)
JAVA面试汇总(二)多线程(一)
JAVA面试汇总(二)多线程(二)
JAVA面试汇总(二)多线程(三)
JAVA面试汇总(二)多线程(四)
JAVA面试汇总(二)多线程(五)
JAVA面试汇总(二)多线程(六)
JAVA面试汇总(二)多线程(七)
JAVA面试汇总(一)Java基础知识

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342