Hive学习之路 (七)Hive的DDL操作

时间:2021-08-13 04:24:30

库操作

1、创建库

语法结构

CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name

  [COMMENT database_comment]      //关于数据块的描述

  [LOCATION hdfs_path]          //指定数据库在HDFS上的存储位置

  [WITH DBPROPERTIES (property_name=property_value, ...)];    //指定数据块属性

  默认地址:/user/hive/warehouse/db_name.db/table_name/partition_name/…

创建库的方式

(1)创建普通的数据库

: jdbc:hive2://hadoop3:10000> create database t1;
No rows affected (0.308 seconds)
: jdbc:hive2://hadoop3:10000> show databases;
+----------------+
| database_name |
+----------------+
| default |
| myhive |
| t1 |
+----------------+
rows selected (0.393 seconds)
: jdbc:hive2://hadoop3:10000>

(2)创建库的时候检查存与否

: jdbc:hive2://hadoop3:10000> create database if not exists t1;
No rows affected (0.176 seconds)
: jdbc:hive2://hadoop3:10000>

(3)创建库的时候带注释


0: jdbc:hive2://hadoop3:10000> create database if not exists t2 comment 'learning hive';
No rows affected (0.217 seconds)
0: jdbc:hive2://hadoop3:10000>

Hive学习之路 (七)Hive的DDL操作

(4)创建带属性的库

: jdbc:hive2://hadoop3:10000> create database if not exists t3 with dbproperties('creator'='hadoop','date'='2018-04-05');
No rows affected (0.255 seconds)
: jdbc:hive2://hadoop3:10000>

2、查看库

查看库的方式

(1)查看有哪些数据库

0: jdbc:hive2://hadoop3:10000> show databases;
+----------------+
| database_name |
+----------------+
| default |
| myhive |
| t1 |
| t2 |
| t3 |
+----------------+
5 rows selected (0.164 seconds)
0: jdbc:hive2://hadoop3:10000>

Hive学习之路 (七)Hive的DDL操作

(2)显示数据库的详细属性信息

语法

desc database [extended] dbname;

示例

: jdbc:hive2://hadoop3:10000> desc database extended t3;
+----------+----------+------------------------------------------+-------------+-------------+------------------------------------+
| db_name | comment | location | owner_name | owner_type | parameters |
+----------+----------+------------------------------------------+-------------+-------------+------------------------------------+
| t3 | | hdfs://myha01/user/hive/warehouse/t3.db | hadoop | USER | {date=2018-04-05, creator=hadoop} |
+----------+----------+------------------------------------------+-------------+-------------+------------------------------------+
row selected (0.11 seconds)
: jdbc:hive2://hadoop3:10000>

Hive学习之路 (七)Hive的DDL操作

(3)查看正在使用哪个库

: jdbc:hive2://hadoop3:10000> select current_database();
+----------+
| _c0 |
+----------+
| default |
+----------+
row selected (1.36 seconds)
: jdbc:hive2://hadoop3:10000>

Hive学习之路 (七)Hive的DDL操作

(4)查看创建库的详细语句

: jdbc:hive2://hadoop3:10000> show create database t3;
+----------------------------------------------+
| createdb_stmt |
+----------------------------------------------+
| CREATE DATABASE `t3` |
| LOCATION |
| 'hdfs://myha01/user/hive/warehouse/t3.db' |
| WITH DBPROPERTIES ( |
| 'creator'='hadoop', |
| 'date'='2018-04-05') |
+----------------------------------------------+
rows selected (0.155 seconds)
: jdbc:hive2://hadoop3:10000>

Hive学习之路 (七)Hive的DDL操作

3、删除库

说明

删除库操作

drop database dbname;
drop database if exists dbname;

默认情况下,hive 不允许删除包含表的数据库,有两种解决办法:

1、 手动删除库下所有表,然后删除库

2、 使用 cascade 关键字

drop database if exists dbname cascade;

默认情况下就是 restrict drop database if exists myhive ==== drop database if exists myhive restrict

示例

(1)删除不含表的数据库

: jdbc:hive2://hadoop3:10000> show tables in t1;
+-----------+
| tab_name |
+-----------+
+-----------+
No rows selected (0.147 seconds)
: jdbc:hive2://hadoop3:10000> drop database t1;
No rows affected (0.178 seconds)
: jdbc:hive2://hadoop3:10000> show databases;
+----------------+
| database_name |
+----------------+
| default |
| myhive |
| t2 |
| t3 |
+----------------+
rows selected (0.124 seconds)
: jdbc:hive2://hadoop3:10000>

Hive学习之路 (七)Hive的DDL操作

(2)删除含有表的数据库

: jdbc:hive2://hadoop3:10000> drop database if exists t3 cascade;
No rows affected (1.56 seconds)
: jdbc:hive2://hadoop3:10000>

Hive学习之路 (七)Hive的DDL操作

4、切换库

语法

use database_name

示例

: jdbc:hive2://hadoop3:10000> use t2;
No rows affected (0.109 seconds)
: jdbc:hive2://hadoop3:10000>

Hive学习之路 (七)Hive的DDL操作

表操作

1、创建表

语法

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]

详情请参见: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualD DL-CreateTable

CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXIST 选项来忽略这个异常
EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)
LIKE 允许用户复制现有的表结构,但是不复制数据
COMMENT可以为表与字段增加描述
PARTITIONED BY 指定分区
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 确定表的具体的列的数据。
STORED AS
  SEQUENCEFILE //序列化文件
  | TEXTFILE //普通的文本文件格式
  | RCFILE  //行列存储相结合的文件
  | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname //自定义文件格式
  如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCE 。
LOCATION指定表在HDFS的存储路径

最佳实践:
  如果一份数据已经存储在HDFS上,并且要被多个用户或者客户端使用,最好创建外部表
  反之,最好创建内部表。

  如果不指定,就按照默认的规则存储在默认的仓库路径中。

示例

使用t2数据库进行操作

(1)创建默认的内部表

: jdbc:hive2://hadoop3:10000> create table student(id int, name string, sex string, age int,department string) row format delimited fields terminated by ",";
No rows affected (0.222 seconds)
: jdbc:hive2://hadoop3:10000> desc student;
+-------------+------------+----------+
| col_name | data_type | comment |
+-------------+------------+----------+
| id | int | |
| name | string | |
| sex | string | |
| age | int | |
| department | string | |
+-------------+------------+----------+
rows selected (0.168 seconds)
: jdbc:hive2://hadoop3:10000>

Hive学习之路 (七)Hive的DDL操作

(2)外部表

: jdbc:hive2://hadoop3:10000> create external table student_ext
(id int, name string, sex string, age int,department string) row format delimited fields terminated by "," location "/hive/student";

No rows affected (0.248 seconds)
: jdbc:hive2://hadoop3:10000>

(3)分区表

: jdbc:hive2://hadoop3:10000> create external table student_ptn(id int, name string, sex string, age int,department string)
. . . . . . . . . . . . . . .> partitioned by (city string)
. . . . . . . . . . . . . . .> row format delimited fields terminated by ","
. . . . . . . . . . . . . . .> location "/hive/student_ptn";
No rows affected (0.24 seconds)
: jdbc:hive2://hadoop3:10000>

添加分区

: jdbc:hive2://hadoop3:10000> alter table student_ptn add partition(city="beijing");
No rows affected (0.269 seconds)
: jdbc:hive2://hadoop3:10000> alter table student_ptn add partition(city="shenzhen");
No rows affected (0.236 seconds)
: jdbc:hive2://hadoop3:10000>

如果某张表是分区表。那么每个分区的定义,其实就表现为了这张表的数据存储目录下的一个子目录
如果是分区表。那么数据文件一定要存储在某个分区中,而不能直接存储在表中。

(4)分桶表

: jdbc:hive2://hadoop3:10000> create external table student_bck(id int, name string, sex string, age int,department string)
. . . . . . . . . . . . . . .> clustered by (id) sorted by (id asc, name desc) into 4 buckets
. . . . . . . . . . . . . . .> row format delimited fields terminated by ","
. . . . . . . . . . . . . . .> location "/hive/student_bck";
No rows affected (0.216 seconds)
: jdbc:hive2://hadoop3:10000>

(5)使用CTAS创建表

作用: 就是从一个查询SQL的结果来创建一个表进行存储

现象student表中导入数据

: jdbc:hive2://hadoop3:10000> load data local inpath "/home/hadoop/student.txt" into table student;
No rows affected (0.715 seconds)
: jdbc:hive2://hadoop3:10000> select * from student;
+-------------+---------------+--------------+--------------+---------------------+
| student.id | student.name | student.sex | student.age | student.department |
+-------------+---------------+--------------+--------------+---------------------+
| | 刘晨 | 女 | | IS |
| | 王风娟 | 女 | | IS |
| | 王一 | 女 | | IS |
| | 冯伟 | 男 | | CS |
| | 王小丽 | 女 | | CS |
| | 邢小丽 | 女 | | IS |
| | 赵钱 | 男 | | IS |
| | 王敏 | 女 | | MA |
| | 张立 | 男 | | IS |
| | 孙花 | 女 | | CS |
| | 孔小涛 | 男 | | CS |
| | 刘刚 | 男 | | MA |
| | 孙庆 | 男 | | CS |
| | 易思玲 | 女 | | MA |
| | 李娜 | 女 | | CS |
| | 周二 | 男 | | MA |
| | 郑明 | 男 | | MA |
| | 李勇 | 男 | | CS |
| | 包小柏 | 男 | | MA |
| | 梦圆圆 | 女 | | MA |
| | 王君 | 男 | | MA |
+-------------+---------------+--------------+--------------+---------------------+
rows selected (0.342 seconds)
: jdbc:hive2://hadoop3:10000>

使用CTAS创建表

: jdbc:hive2://hadoop3:10000> create table student_ctas as select * from student where id < 95012;
WARNING: Hive-on-MR is deprecated in Hive and may not be available in the future versions. Consider using a different execution
engine (i.e. spark, tez) or using Hive .X releases.
No rows affected (34.514 seconds)
: jdbc:hive2://hadoop3:10000> select * from student_ctas
. . . . . . . . . . . . . . .> ;
+------------------+--------------------+-------------------+-------------------+--------------------------+
| student_ctas.id | student_ctas.name | student_ctas.sex | student_ctas.age | student_ctas.department |
+------------------+--------------------+-------------------+-------------------+--------------------------+
| | 刘晨 | 女 | | IS |
| | 王敏 | 女 | | MA |
| | 张立 | 男 | | IS |
| | 孔小涛 | 男 | | CS |
| | 刘刚 | 男 | | MA |
| | 孙庆 | 男 | | CS |
| | 易思玲 | 女 | | MA |
| | 李娜 | 女 | | CS |
| | 李勇 | 男 | | CS |
| | 包小柏 | 男 | | MA |
| | 梦圆圆 | 女 | | MA |
+------------------+--------------------+-------------------+-------------------+--------------------------+
rows selected (0.445 seconds)
: jdbc:hive2://hadoop3:10000>

Hive学习之路 (七)Hive的DDL操作

(6)复制表结构

: jdbc:hive2://hadoop3:10000> create table student_copy like student;
No rows affected (0.217 seconds)
: jdbc:hive2://hadoop3:10000>

注意:

如果在table的前面没有加external关键字,那么复制出来的新表。无论如何都是内部表
如果在table的前面有加external关键字,那么复制出来的新表。无论如何都是外部表

Hive学习之路 (七)Hive的DDL操作

2、查看表

(1)查看表列表

查看当前使用的数据库中有哪些表

: jdbc:hive2://hadoop3:10000> show tables;
+---------------+
| tab_name |
+---------------+
| student |
| student_bck |
| student_copy |
| student_ctas |
| student_ext |
| student_ptn |
+---------------+
rows selected (0.163 seconds)
: jdbc:hive2://hadoop3:10000>

查看非当前使用的数据库中有哪些表

: jdbc:hive2://hadoop3:10000> show tables in myhive;
+-----------+
| tab_name |
+-----------+
| student |
+-----------+
row selected (0.144 seconds)
: jdbc:hive2://hadoop3:10000>

查看数据库中以xxx开头的表

: jdbc:hive2://hadoop3:10000> show tables like 'student_c*';
+---------------+
| tab_name |
+---------------+
| student_copy |
| student_ctas |
+---------------+
rows selected (0.13 seconds)
: jdbc:hive2://hadoop3:10000>

(2)查看表的详细信息

查看表的信息

: jdbc:hive2://hadoop3:10000> desc student;
+-------------+------------+----------+
| col_name | data_type | comment |
+-------------+------------+----------+
| id | int | |
| name | string | |
| sex | string | |
| age | int | |
| department | string | |
+-------------+------------+----------+
rows selected (0.149 seconds)
: jdbc:hive2://hadoop3:10000>

查看表的详细信息(格式不友好)

: jdbc:hive2://hadoop3:10000> desc extended student;

Hive学习之路 (七)Hive的DDL操作

查看表的详细信息(格式友好)

: jdbc:hive2://hadoop3:10000> desc formatted student;

Hive学习之路 (七)Hive的DDL操作

查看分区信息

: jdbc:hive2://hadoop3:10000> show partitions student_ptn;

Hive学习之路 (七)Hive的DDL操作

(3)查看表的详细建表语句

: jdbc:hive2://hadoop3:10000> show create table student_ptn;

Hive学习之路 (七)Hive的DDL操作

3、修改表

(1)修改表名

: jdbc:hive2://hadoop3:10000> alter table student rename to new_student;

Hive学习之路 (七)Hive的DDL操作

(2)修改字段定义

A. 增加一个字段

: jdbc:hive2://hadoop3:10000> alter table new_student add columns (score int);

Hive学习之路 (七)Hive的DDL操作

B. 修改一个字段的定义

: jdbc:hive2://hadoop3:10000> alter table new_student change name new_name string;

Hive学习之路 (七)Hive的DDL操作

C. 删除一个字段

不支持

D. 替换所有字段

: jdbc:hive2://hadoop3:10000> alter table new_student replace columns (id int, name string, address string);

Hive学习之路 (七)Hive的DDL操作

(3)修改分区信息

A. 添加分区

静态分区

  添加一个

: jdbc:hive2://hadoop3:10000> alter table student_ptn add partition(city="chongqing");

  添加多个

: jdbc:hive2://hadoop3:10000> alter table student_ptn add partition(city="chongqing2") partition(city="chongqing3") partition(city="chongqing4");

动态分区

先向student_ptn表中插入数据,数据格式如下图

: jdbc:hive2://hadoop3:10000> load data local inpath "/home/hadoop/student.txt" into table student_ptn partition(city="beijing");

Hive学习之路 (七)Hive的DDL操作

现在我把这张表的内容直接插入到另一张表student_ptn_age中,并实现sex为动态分区(不指定到底是哪中性别,让系统自己分配决定)

首先创建student_ptn_age并指定分区为age

: jdbc:hive2://hadoop3:10000> create table student_ptn_age(id int,name string,sex string,department string) partitioned by (age int);

从student_ptn表中查询数据并插入student_ptn_age表中

: jdbc:hive2://hadoop3:10000> insert overwrite table student_ptn_age partition(age)
. . . . . . . . . . . . . . .> select id,name,sex,department,age from student_ptn;
WARNING: Hive-on-MR is deprecated in Hive and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive .X releases.
No rows affected (27.905 seconds)
: jdbc:hive2://hadoop3:10000>

Hive学习之路 (七)Hive的DDL操作

Hive学习之路 (七)Hive的DDL操作

B. 修改分区

修改分区,一般来说,都是指修改分区的数据存储目录

在添加分区的时候,直接指定当前分区的数据存储目录

: jdbc:hive2://hadoop3:10000> alter table student_ptn add if not exists partition(city='beijing') 
. . . . . . . . . . . . . . .> location '/student_ptn_beijing' partition(city='cc') location '/student_cc';
No rows affected (0.306 seconds)
: jdbc:hive2://hadoop3:10000>

修改已经指定好的分区的数据存储目录

: jdbc:hive2://hadoop3:10000> alter table student_ptn partition (city='beijing') set location '/student_ptn_beijing';

此时原先的分区文件夹仍存在,但是在往分区添加数据时,只会添加到新的分区目录

Hive学习之路 (七)Hive的DDL操作

Hive学习之路 (七)Hive的DDL操作

C. 删除分区

: jdbc:hive2://hadoop3:10000> alter table student_ptn drop partition (city='beijing');

Hive学习之路 (七)Hive的DDL操作

4、删除表

: jdbc:hive2://hadoop3:10000> drop table new_student;

Hive学习之路 (七)Hive的DDL操作

5、清空表

: jdbc:hive2://hadoop3:10000> truncate table student_ptn;

其他辅助命令

Hive学习之路 (七)Hive的DDL操作

Hive学习之路 (七)Hive的DDL操作

Hive学习之路 (七)Hive的DDL操作的更多相关文章

  1. Object-c学习之路七(oc字符串操作)

    // // main.m // NSString // // Created by WildCat on 13-7-25. // Copyright (c) 2013年 wildcat. All ri ...

  2. &lbrack;转帖&rsqb;Hive学习之路 (一)Hive初识

    Hive学习之路 (一)Hive初识 https://www.cnblogs.com/qingyunzong/p/8707885.html 讨论QQ:1586558083 目录 Hive 简介 什么是 ...

  3. &lbrack;Python学习笔记&rsqb;&lbrack;第七章Python文件操作&rsqb;

    2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...

  4. Git学习之路(6)- 分支操作

    ▓▓▓▓▓▓ 大致介绍 几乎所有的版本控制系统都会支持分支操作,分支可以让你在不影响开发主线的情况下,随心所欲的实现你的想法,但是在大多数的版本控制系统中,这个过程的效率是非常低的.就比如我在没有学习 ...

  5. Hive 学习之路(七)—— Hive 常用DML操作

    一.加载文件数据到表 1.1 语法 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (p ...

  6. Hive学习之路 (一)Hive初识

    Hive 简介 什么是Hive 1.Hive 由 Facebook 实现并开源 2.是基于 Hadoop 的一个数据仓库工具 3.可以将结构化的数据映射为一张数据库表 4.并提供 HQL(Hive S ...

  7. Hive学习之路 (二十一)Hive 优化策略

    一.Hadoop 框架计算特性 1.数据量大不是问题,数据倾斜是个问题 2.jobs 数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次 汇总,产生十几个 jobs,耗时很长.原 ...

  8. Hive学习之路 (二)Hive安装

    Hive的下载 下载地址http://mirrors.hust.edu.cn/apache/ 选择合适的Hive版本进行下载,进到stable-2文件夹可以看到稳定的2.x的版本是2.3.3 Hive ...

  9. Hive学习之路 (二十)Hive 执行过程实例分析

    一.Hive 执行过程概述 1.概述 (1) Hive 将 HQL 转换成一组操作符(Operator),比如 GroupByOperator, JoinOperator 等 (2)操作符 Opera ...

  10. Hive学习之路 (十八)Hive的Shell操作

    一.Hive的命令行 1.Hive支持的一些命令 Command Description quit Use quit or exit to leave the interactive shell. s ...

随机推荐

  1. Canvas电子签名和游戏化

    今天一天的时间都在做包团报价的无流程原型设计,一方面参考了其他系统,一方面整理先在系统中不合理的部分,规范了报价元素的分类.梳理了意向需求,其实原来粗略的放了一个模板进去是听不靠谱的.客户的要求-&g ...

  2. 去除tabbar的灰线

    去掉导航栏的边界灰线 [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBar ...

  3. IO流--字符流

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java ...

  4. 单选复选按钮以及Toast学习笔记

    1:单选按钮是以组的形式呈现,xml布局文件中需要定义一个RadioGroup,然后在这个组内再定义RadioButton.在java代码中为该按钮添加监听时,需要用组名来引用对应的方法setOnCh ...

  5. Junit单元测试的实例

    进行单元测试的代码 package JunitTest; import org.junit.Test; public class Calculator { private static int res ...

  6. 03 InnoDB锁问题

    InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识 ...

  7. 【linux操作命令】vim

    高级一些的编辑器,都会包含宏功能,vim当然不能缺少了,在vim中使用宏是非常方便的: :qx     开始记录宏,并将结果存入寄存器x q     退出记录模式 @x     播放记录在x寄存器中的 ...

  8. 转载:ECMAScript 6简介

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发 ...

  9. 我的 FPGA 学习历程(11)—— 实验:按键消抖

    按键是一个输入设备,在理论上可以归为开关一类,理想的按键波形如下: 然而由于按键的机械特性,断开和闭合动作是不可能在一瞬间完成的,实际的波形如下: 抖动期间电平处于临界值,由于晶振的频率相当的高,数字 ...

  10. swift 学习- 12 -- 方法

    // 方法 是与某些特定类型相关的函数.  类, 结构体,枚举 都可以定义实例方法, 实例方法为给类型的实例封装了具体的任务与功能.  类, 结构体, 枚举 也可以定义类型方法,  类型方法与类型本身 ...