DDL,Hive Data Definition Language,数据定义语言;

通俗理解就是数据库与库表相关的操作,本文总结一下基本方法

hive 数据仓库配置

hive 数据仓库默认位置在 hdfs 上的 /user/hive/warehouse 路径下;

hive 有个默认的数据库叫 default;

但是在 /user/hive/warehouse 路径下没有创建 default 文件夹,default 下的表是直接在 /user/hive/warehouse 路径下 创建文件夹

在 hive 中,数据库对应 hdfs 上一个路径(叫文件夹或者更合适),数据表也对应 hdfs 上一个路径,数据对应 hdfs 上一个文件

管理表 vs 外建表

管理表也称内建表;hive 默认创建的表都是管理表;

管理表和外建表的数据都存储在 hdfs,因为都是 hive 的表;

区别

hive 在创建内部表时,会把数据移动到数据仓库指定的路径,如 hdfs 某个地方;

如果创建外部表,不会移动数据,仅在元数据中记录数据所在的位置;

最大的区别在于:当删除内部表时,同时删除数据和元数据;当删除外部表时,仅删除元数据,不删除数据;

鉴于这种特性,管理表不适合共享数据,容易产生安全问题;

在实际工作中,一般使用外建表

相互转换

查看表的类型

hive> desc formatted student_p;
Table Type: MANAGED_TABLE

管理表 to 外部表

hive> alter table student_p set tblproperties('EXTERNAL'='TRUE');
Table Type: EXTERNAL_TABLE

外部表 to 管理表

hive> alter table student_p set tblproperties('EXTERNAL'='FALSE');

注意必须大写

Database

Create Database

CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];

示例

hive> create database hive1101 location '/usr/hive_test';
OK
Time taken: 0.12 seconds

注意这里 location 的地址并不是 hive 默认的 hdfs 地址,说明是可以指定非默认地址的

Drop Database

数据库必须是空的

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];

Alter Database

改变数据库的属性

ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...);   -- (Note: SCHEMA added in Hive 0.14.0)
ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role; -- (Note: Hive 0.13.0 and later; SCHEMA added in Hive 0.14.0)
ALTER (DATABASE|SCHEMA) database_name SET LOCATION hdfs_path; -- (Note: Hive 2.2.1, 2.4.0 and later)

示例

hive> alter database hive1101 set dbproperties ('edit_by'='wjd');
OK
Time taken: 0.118 seconds

注意,location 无法更改

可能只有 Hive 2.2.1, 2.4.0 and later 才可以,我的是 2.3.6,没有测试

Use Database

切换到目标数据库下

USE database_name;
USE DEFAULT;

Show Database

显示所有数据库名称

show databases;

显示数据库信息

hive> desc database hive1101;
OK
hive1101 hdfs://hadoop10:9000/usr/hive_test root USER
Time taken: 0.182 seconds, Fetched: 1 row(s)

只显示了元数据信息,也可以 在 database 后加 extended,能多显示一些信息

Table

Create Table

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name    -- (Note: TEMPORARY available in Hive 0.14.0 and later)
[(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])]
[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]
[SKEWED BY (col_name, col_name, ...) -- (Note: Available in Hive 0.10.0 and later)]
ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
[STORED AS DIRECTORIES]
[
[ROW FORMAT row_format]
[STORED AS file_format]
| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)] -- (Note: Available in Hive 0.6.0 and later)
]
[LOCATION hdfs_path]

后面还有很多参数,具体可参照官网 - 下面的参考资料

参数解释

temporary

exeternal:创建一个外部表,同时需要指定实际数据所在的路径,location 来指定

like:复制表结构,但不复制数据

row format:指定每行的格式,如果原数据的格式不符,可以写入表,但不能正确的写入表

  // delimited fields terminated by '\t'   以 \t 为间隔

  // delimited fields terminated by ','  注意逗号分隔的只能是 csv 文件,自己写的不能用,会出错

  // delimited 间隔;terminated 结尾;

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, ...)]

stored as: 加载的文件格式

  // 如果是纯文本文件,可以用 stored as textfile;如果是压缩文件,可以用 stored as  SEQUENCEFILE

  // 还有 ORC、json 等多种个数,可查看官网

partitioned by:分区表,这个很重要,后面专门讲

CLUSTERED BY:分桶表,后面和分区表一起将

示例

hive> create table student(id int,name string) row format delimited fields terminated by '\t'; 创建表,以
hive> create table if not exists student1 like student; 创建一个和表一样模式的表 hive> create table if not exists mytable(sid int,sname string)
> row format delimited fields terminated by '\005'
> stored as textfile; 创建内部表 hive> create external table if not exists pageview(
> pageid int,
> page_url string comment 'the page url'
> )
> row format delimited fields terminated by ','
> location 'hdfs://192.168.220.144:9000/user/hive/warehouse'; 创建外部表 hive> create table student_p(id int,name string,sexex string,age int,dept string)
> partitioned by(part string)
> row format delimited fields terminated by ','
> stored as textfile; 创建分区表

测试 row format 

写入如下数据到 student,以 \t 为间隔

1    a
2 b
3 c
4 d,

很显然,最后一行不是以 \t 间隔

hive> load data local inpath '/usr/lib/hive2.3.6/1.txt' into table student;
Loading data to table hive1101.student
OK
Time taken: 0.868 seconds
hive> select * from student;
OK
1 a
2 b
3 c
NULL NULL
Time taken: 0.17 seconds, Fetched: 4 row(s)

可以看到最后一行没有正确的写入

Drop Table

DROP TABLE [IF EXISTS] table_name [PURGE];     -- (Note: PURGE available in Hive 0.14.0 and later)

Truncate Table

清空表;注意不能清空外部表

TRUNCATE TABLE table_name [PARTITION partition_spec];

partition_spec:
: (partition_column = partition_col_value, partition_column = partition_col_value, ...)

Alter Table

修改表的属性

Rename Table

ALTER TABLE table_name RENAME TO new_table_name;

Alter Table Properties

ALTER TABLE table_name SET TBLPROPERTIES table_properties;

table_properties:
: (property_name = property_value, property_name = property_value, ... )
Alter Table Comment
ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comment);

Add SerDe Properties

ALTER TABLE table_name [PARTITION partition_spec] SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties];

ALTER TABLE table_name [PARTITION partition_spec] SET SERDEPROPERTIES serde_properties;

serde_properties:
: (property_name = property_value, property_name = property_value, ... )

Alter Column

Change Column Name/Type/Position/Comment

修改列的名字,类型,位置 等

ALTER TABLE table_name [PARTITION partition_spec] CHANGE [COLUMN] col_old_name col_new_name column_type
[COMMENT col_comment] [FIRST|AFTER column_name] [CASCADE|RESTRICT];

示例

CREATE TABLE test_change (a int, b int, c int);

// First change column a's name to a1.
ALTER TABLE test_change CHANGE a a1 INT; // Next change column a1's name to a2, its data type to string, and put it after column b.
ALTER TABLE test_change CHANGE a1 a2 STRING AFTER b;
// The new table's structure is: b int, a2 string, c int. // Then change column c's name to c1, and put it as the first column.
ALTER TABLE test_change CHANGE c c1 INT FIRST;
// The new table's structure is: c1 int, b int, a2 string. // Add a comment to column a1
ALTER TABLE test_change CHANGE a1 a1 INT COMMENT 'this is column a1';

Add/Replace Columns

增加或者替换列

ALTER TABLE table_name
[PARTITION partition_spec] -- (Note: Hive 0.14.0 and later)
ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
[CASCADE|RESTRICT] -- (Note: Hive 1.1.0 and later)

Index

Create Index

CREATE INDEX index_name
ON TABLE base_table_name (col_name, ...)
AS index_type
[WITH DEFERRED REBUILD]
[IDXPROPERTIES (property_name=property_value, ...)]
[IN TABLE index_table_name]
[
[ ROW FORMAT ...] STORED AS ...
| STORED BY ...
]
[LOCATION hdfs_path]
[TBLPROPERTIES (...)]
[COMMENT "index comment"];

Drop Index

DROP INDEX [IF EXISTS] index_name ON table_name;

Alter Index

ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;

Show

Show Databases

SHOW (DATABASES|SCHEMAS) [LIKE 'identifier_with_wildcards'];

Show Tables

SHOW TABLES [IN database_name] ['identifier_with_wildcards'];

Show Table Properties

SHOW TBLPROPERTIES tblname;
SHOW TBLPROPERTIES tblname("foo");

Show Create Table

SHOW CREATE TABLE ([db_name.]table_name|view_name);

Show Indexes

SHOW [FORMATTED] (INDEX|INDEXES) ON table_with_index [(FROM|IN) db_name];

Show Columns

SHOW COLUMNS (FROM|IN) table_name [(FROM|IN) db_name];

示例

-- SHOW COLUMNS
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE foo(col1 INT, col2 INT, col3 INT, cola INT, colb INT, colc INT, a INT, b INT, c INT); -- SHOW COLUMNS basic syntax
SHOW COLUMNS FROM foo; -- show all column in foo
SHOW COLUMNS FROM foo "*"; -- show all column in foo
SHOW COLUMNS IN foo "col*"; -- show columns in foo starting with "col" OUTPUT col1,col2,col3,cola,colb,colc
SHOW COLUMNS FROM foo '*c'; -- show columns in foo ending with "c" OUTPUT c,colc
SHOW COLUMNS FROM foo LIKE "col1|cola"; -- show columns in foo either col1 or cola OUTPUT col1,cola
SHOW COLUMNS FROM foo FROM test_db LIKE 'col*'; -- show columns in foo starting with "col" OUTPUT col1,col2,col3,cola,colb,colc
SHOW COLUMNS IN foo IN test_db LIKE 'col*'; -- show columns in foo starting with "col" (FROM/IN same) OUTPUT col1,col2,col3,cola,colb,colc -- Non existing column pattern resulting in no match
SHOW COLUMNS IN foo "nomatch*";
SHOW COLUMNS IN foo "col+"; -- + wildcard not supported
SHOW COLUMNS IN foo "nomatch";

加载数据

不属于 DDL,属于 DML,后面会讲

参考资料:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL  官网

https://ask.hellobi.com/blog/wujiadong/9483

https://blog.csdn.net/xiaozelulu/article/details/81585867

Hive 教程(三)-DDL基础的更多相关文章

  1. Hive 教程(七)-DML基础

    DML,Hive Data Manipulation Language,数据操作语言: 通俗理解就是数据库里与数据的操作,如增删改查,统计汇总等: Loading files into tables ...

  2. JavaScript 入门教程三 语言基础【1】

     一.基本介绍 1.JavaScript 是一种区分大小写的语言.(var Hello 与 var hello 是不同的变量) 2.JavaScript 中标志符就是指变量.函数.属性的名字,或者函数 ...

  3. Java 教程整理:基础、项目全都有

    Java 在编程语言排行榜中一直位列前排,可知 Java 语言的受欢迎程度了. 网上有很多 Java 教程,无论是基础入门还是开发小项目的教程都比比皆是,可是系统的很少,对于Java 学习者来说找到系 ...

  4. Laravel教程 三:视图变量传递和Blade

    Laravel教程 三:视图变量传递和Blade 此文章为原创文章,未经同意,禁止转载. Blade 上一篇我们简单地说了Router,Views和Controllers的工作流程,这一次我就按照上一 ...

  5. Windows 8实例教程系列 - 数据绑定基础实例

    原文:Windows 8实例教程系列 - 数据绑定基础实例 数据绑定是WPF,Silverlight以及Windows Phone应用开发中最为常用的开发技术,在基于XAML的Windows Stor ...

  6. Nmap扫描教程之网络基础服务DHCP服务类

    Nmap扫描教程之网络基础服务DHCP服务类 Nmap网络基础服务 网络基础服务是网络正常工作的基石,常见的网络基础服务包括DHCP服务和DNS服务.其中,DHCP服务用来为计算机动态分配IP地址:D ...

  7. 在Hive中执行DDL之类的SQL语句时遇到的一个问题

    在Hive中执行DDL之类的SQL语句时遇到的一个问题 作者:天齐 遇到的问题如下: hive> create table ehr_base(id string); FAILED: Execut ...

  8. Java基础教程:泛型基础

    Java基础教程:泛型基础 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...

  9. CRL快速开发框架系列教程三(更新数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

随机推荐

  1. Android_(控件)使用Gallery浏览手机上SD卡中图片

    运行截图: (发现后面两张照片是自己自拍,大写的尴尬对图片进行涂鸦了!!!) 程序结构: <?xml version="1.0" encoding="utf-8&q ...

  2. HDU 5810 Balls and Boxes ——(数学,概率,方差)

    官方题解看不太懂,参考了一些人的博客以后自己证明如下: 其中D(X)和E(X)的公式如下(参考自百度百科): 其中 p = 1 / m .(这是每一个单独事件发生的概率期望,在这里单独事件指的是一个球 ...

  3. iOS8-Sampler

    https://github.com/shu223/iOS8-Sampler iOS8-Sampler Code examples for the new functions of iOS 8. Ho ...

  4. 线程系列3--Java线程同步通信技术

    上一篇文章我们讲解了线程间的互斥技术,使用关键字synchronize来实现线程间的互斥技术.根据不同的业务情况,我们可以选择某一种互斥的方法来实现线程间的互斥调用.例如:自定义对象实现互斥(sync ...

  5. 纹身女孩 Tattooed girl 可爱动人 出水芙蓉 窈窕多姿

    目录 开宗明义

  6. HearthBuddy的狂野和休闲模式来回切换

    表现1 配置是标准,休闲模式 然后一直重复提示 select desire deck select causal mode 表现2 配置是狂野,休闲模式 然后一直提示 切换到狂野 切换到标准 把模式切 ...

  7. 一、基础篇--1.2Java集合-HashMap死循环问题

    为什么HashMap会出现死循环 首先,我们知道java的HashMap不是线程安全的.多线程下应该使用ConcurrentHashMap. HashMap底层是基于动态数组和单向链表(JDK1.7, ...

  8. echarts修改X,Y轴上的颜色

     分为2.0和3.0 一.2.0 修改的代码: x轴: xAxis : [ { type : 'category', data : ['<30','30-','40-','50-','60-', ...

  9. DDNS是动态域名解析的意思

    目前大部分家庭使用PPPOE拨号方式上网,每次上网获得的IP都是随机变换的,但是家里的网络监控.智能设备需要通过网络访问,每次使用都需要先知道IP非常麻烦. 有了DDNS动态域名解析,我们只要到花生壳 ...

  10. Eclipse使用高版本的jdk编译低版本的class文件的方法

    如题,在这两天使用eclipse工具编译代码时,编译出来的class文件拿UE工具查看,版本为1.8版本的,而本地使用的tomcat版本是1.6的,运行中报错Unsupported major.min ...