Hive 的DDL和DML

DDL

1.库

建库:

> create database if not exists 库名; 

还有一个方式:

> create database if not exists 库名 location 路径; 

指定hdfs路径

查看数据库:

> show databases;

看数据库信息:

> desc databases 库名;

想多看点:

> desc databases extended 库名;

改库:(数据库名和数据库目录位置无法修改)

> alter database 库名 set ...

删库:(想跑路?)
空库:

> drop database if exists 库名;

非空库:

> drop database 库名 cascade;

2.表

建表:

> create [external] table [if not exist] 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]

语句特别长,中括号里面的不是必要的,但是大多数情况下的建表都是分区表。
1.create table 就是建表基础。
2.external:关键字是可以创建于一个外部表,建表同时指定一个指向实际数据的路径(location)。
hive创建内部表时,会将数据移动到数据仓库指向的路径;
如果创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。
区别就在于删除表的时候。内部表元数据和数据都会被删除,外部表只删除元数据,不删除数据。
3.comment:添加注释(对表、对列)
4.partitioned by:创建分区表
5.clustered by:创建分桶表
6.sorted by : 排序,基本不用
7.row format:数据切分形式
8.stored as :指定文件存储类型
9.location:指定表在hdfs的位置
10.like :允许用户复制现有变结构,但不复制数据

我们使用create table的时候,基本上hive帮我们补充了其他参数的默认值。

管理表

默认创建的表都是管理表,有时候也称为内部表。这种表,hive会控制数据的生命周期,我们删除表的时候,hive也会删除表中的数据。
外部表更安全一些,毕竟数据是分开的。删表之后数据会保留。

查询表的类型

> desc formatted 表名

能发现Table_type,是表的类型。可以修改

内部表改为外部表

> alert table 表名 set tblproperties ('EXTERNAL'='TRUE')

外部表改为内部表

> alert table 表名 set tblproperties ('EXTERNAL'='FALSE')

MANAGED_TABLE是内部表,EXTERNAL_TABLE是外部表。
注意!!!('EXTERNAL'='TRUE')和 ('EXTERNAL'='FALSE')这个要区分大小写!!!

3.分区

分区的意义:分区表实际上来说,就是对应HDFS文件系统上独立的文件夹,该文件夹下是该分区所有数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要,分割成小的数据集。在查询的时候,通过where子句中的表达式,选择查询所需要的指定分区。提高查询效率(谓词下推)。

3.1 引入分区表(根据日期对日志进行管理)

/user/hive/warehouse/log_partition/20191028/20191028.log
/user/hive/warehouse/log_partition/20191029//20191029.log
/user/hive/warehouse/log_partition/20191030//20191030.log

3.2 创建分区表

> create table dept_partition(deptno int,dname string,loc string) 
partitioned by (month string)
row format delimited fields terminated by '\t';

3.3 加载数据到分区表中

> load data local inpath '/mnt/hgfs/shareOS/dept.txt' into table dept_partition partition(month='2019-06');
> load data local inpath '/mnt/hgfs/shareOS/dept.txt' into table dept_partition partition(month='2019-07');

看到生成了两个文件,select的时候发现,查询的是两个文件和并的数据。并且帮我们自动添加了month,并且它可以作为查询条件。这个条件区分了文件夹,查询的时候会被先访问。
我们去mysql看元数据。PARTITION表,增加了两条数据。这个记录了我们的分区。

3.4 查询分区表中数据

单分区查询:

> select * from dept_partition where month = '2019-06';

多分区联合查询:

> select * from dept_partition where month = '2019-06' 
    union
        select * from dept_partition where month = '2019-07' 
            union
                select * from dept_partition where month = '2019-08' ;

3.5 增加分区

创建单个分区:

> alert table dept_partition add partition(month=''2019-09);

多个分区:

> alert table dept_partition add partition(month=''2019-10) partition(month=''2019-11);

3.6 删除分区

> alter table dept_partition drop partition (month='2019-10');

删多个:

> alter table dept_partition drop partition (month='2019-10'),partition (month='2019-11');

3.7 查看分区表有多少个分区

> show partitions dept_partition;

3.8 分区表结构查看

> desc formatted dept_partition;

多了一个分区字段信息。把分区字段当普通字段使用就可以了。

4.分区表注意事项

4.1 二级分区

> create table dept_partition2(deptno int,dname string,loc string) 
partitioned by (month string,day string)
row format delimited fields terminated by '\t';

4.2 添加的时候,两个也都要填。

> load data local inpath '/mnt/hgfs/shareOS/dept.txt' into table dept_partition partition(month='2019-06',day='10');

4.3 把数据直接上传到分区目录上,让分区表和数据产生关联的三种方式。

(1)上传数据之后修复

> msck repair table dept_partition;

(2)上传数据之后添加分区

> alter table dept_partition add partition(month'2019-11');

(3)创建文件夹之后load数据到分区。
load添加了分区信息,上传了数据,问题直接就解决了。

五.修改表

5.1 改表名

> alter table 表名 RENAME TO new_table_name;

5.3 增加、修改、替换列信息

更新列:

> alter table 表名 change [COLUMN] col_old_name col_new_name 
column_type [COMMENT col_comment] [FIRST|AFTER column_name]

增加和替换列:

> alter table 表名 add|replace COLUMNS 
(col_name data_type [COMMENT col_comment],...)

ADD是增加一个字段,REPLACE是替换表中所有字段。

接下来是部分DML

一.数据导入

1.1.1 向表中装载数据(Load)

语法:

> load data [local] inpath '/opt/soft/文件.txt' overwrite|into 
table 表名 [partition(partcol1=val1,...)];

load data:加载数据
local:表示从本地加载到hive表;否则从HDFS加载到Hive
inpath:加载数据路径
overwrite:表示覆盖表中已有数据,否则表示追加。
into table:表示加载到哪张表
partition:上传到指定分区

1.1.2 通过查询语句插入数据(insert)

> insert into table 表名 partition(month='2019-06') value (1,'zahngsan');

into也可以变成overwrite,基本模式插入。
还有多插入模式之类的。。。不过不常用。

1.1.3 查询语句中创建并加载数据(As Select)

1.创建一张分区表

例如:

> create table if not exist 表名(id int,name string) partitioned by 
(month string) row format delimited fields terminated by '\t';

2.基本插入数据

例如:

> insert into table student partition(month='2019-07') values(1,'wangwu');

3.基本模式插入(覆盖)
例如:

> insert overwrite table student partition(month='2019-07') values(1,'wangwu');

二.数据导出

2.1 Insert导出

1.结果导出到本地

> insert overwrite local directory '/opt/module/datas/export/student'
select * from student;

哎,由于我虚拟机分配内存比较小,系统慢的要死!让我一度以为集群搭建的有问题!!!

2.将结果格式化导出到本地

>insert overwrite local directory '/opt/module/datas/export/student'  
row format delimited fields terminated by '\t'
select * from student;

3.导出到hdfs

>insert overwrite directory '/dept'  
row format delimited fields terminated by '\t'
select * from student;

2.2 Hadoop导出
2.3 Export导出到HDFS
2.4 SQOOP导出
MySQL 与 Hive(HDFS) 之间导来导去。。。

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

推荐阅读更多精彩内容