ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【Hive学习笔记】数据定义语言(DDL)

2021-02-16 13:57:04  阅读:194  来源: 互联网

标签:name 数据库 定义语言 hive Hive student DDL table 分区


在hive中有数据库和数据表的概念,其实和传统数据库的概念是一样的。但是在hive中不管创建的是数据库还是数据表都是文件夹

1 数据库的增删改查

1.1 创建数据库

创建数据库,数据在HDFS上的默认存储路径是/user/hive/warehouse/*.db

hive (default)> create database db_name;

可以使用 if exists 判断数据库是否已存在(存在则不创建)

hive (default)>create database if not exists db_name;

创建一个数据库,并指定数据在HDFS上的存放位置,使用location

hive (default)>create database if not exists db_hive location '/mydata/demo.db'

创建一个数据库,指定一个已存在的文件夹作为数据库内容的存放位置

hive (default)>create database if not exists db_hive location '/mydata/demo'

注意:如果 location 指定的目录不存在,创建的数据库会失败,但是不会显示错误信息。

1.2 查询数据库

显示所有数据库

hive> show databases;

模糊搜索

hive> show databases like 'db*';

查看信息

hive> desc database db_name;

查看详细信息,添加extended参数

hive> desc database extended db_hive;

切换当前数据库

hive> use db_hive;

1.3 修改数据库

可以修改一些其他的附加信息,但不能修改数据库元数据信息,包括数据库名和数据库所在的目录位置。即 desc展示的数据是不可更改的。

给数据库添加信息

hive> alter database db_hive set dbproperties('createtime'='202102');

查看上述添加的信息

hive> desc database extended db_hive;

1.4 删除数据库

删除一个空的数据库

drop database db_name;

最好使用 if exists 判断数据库是否存在

drop database if exists db_name;

如果数据库不为空,可以采用cascade命令强制删除

drop database db_name cascade;

2 数据表的创建和增删改

2.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]
  • external :关键字可以让用户创建一个外部表
  • comment:为表和列添加注释
  • partitioned by:创建分区表
  • clustered by: 创建分桶表
  • sorted by: 排序 不常用
  • row format delimited:设置表中数据的分隔符
    [fields terminated by char] // 字段(列)分隔符
    [collection items terminated by char] // 数组分隔符
    [map keys terminated by char] // map 分隔符
    [lines terminated by char] // 行分隔符 一般默认不写这一句
  • stored as :指定存储文件类型
  • location:指定表在HDFS上的存储位置。
  • like:允许用户复制现有的表结构,但是不复制数据。

例子

创建一张表

create table student(id int, name string);

创建一张外部表

create external table student(id int, name string);

创建表并设置表中数据的分隔符(以制表符为例)

create table student(id int, name string) 
row format delimited fields terminated by '\t';

创建表并设置表中数组数据的分隔符(以制表符为例)

create table student(id int, name string) 
collection items terminated by "\t" ;

2.1.1 管理表

默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive会(或多或少的)控制着数据的生命周期。

Hive默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir(默认在/user/hive/warehouse)所定义的目录下的子目录下。

当我们删除一个管理表的时候,hive也会删除这个表中的数据。 管理表不适合和其他工具共享数据。


普通创建表

create table if not exists student2(id int,name string)
row format delimited fields terminated by '\t'    // 字段(列)分隔符
stored as textfile  //指定存储文件类型
location '/user/hive/warehouse/student2';  //指定表在HDFS上的存储位置

根据查询结果创建表(查询的结果会添加到新的创建的表中)

create table if not exists student3 as select id, name from student2;

根据已经有的表结构创建表

create table if not exists student4 like student2;

2.1.2 外部表

因为表是外部表,所以hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。

即两者的区别在于

删除时,内部表把元数据和具体数据都删除,而外部表只删除元数据。

注:元数据定义为描述数据的数据,可以为数据说明其元素或属性(名称、大小、数据类型、等),或其结构(长度、字段、数据列),或其相关数据(位于何处、如何联系、拥有者)

因此,元数据指的是存在数据库里面的表结构,数据是存储在HDFS下的文件里。


管理表和外部表的使用场景

每天将收集的网站日志定期流入HDFS文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用得到中间表,结果表使用内部表存贮,数据通过select+insert进入内部表。


create external table if not exists default.student(
id int,name string
)
row format delimited fields terminated by '\t';

2.1.3 管理表和外部表的互相转换

内部表修改为外部表

alter table student set tblproperties('EXTERNAL'='TRUE')

外部表修改为内部表

alter table student set tblproperties('EXTERNAL'='FALSE')

注意:(‘EXTERNAL’=‘TRUE’)(‘EXTERNAL’=‘FALSE’)为固定写法,区分大小写!大写是为唯一写法。

2.2 分区表

分区表实际是对应一个HDFS文件系统上的独立的文件,该文件夹下是该分区所有的数据文件。

Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多

hive的分区和MR的分区是不一样的,hive的分桶才是和MR的分区一个概念。hive的分区分的目录分桶才是分的文件


创建分区表

创建一个表,并设置以"month"字段分区

create table student(id int, name string) 
partitioned by(month string);

创建二级分区表

create table student(id int, name string)
partitioned by(month string, day string)

添加分区

往分区表里添加一个分区

alter table student add partition(month='202102');

往分区表里添加多个分区(以空格隔开)

alter table student add partition(month='202102') 
partition(month='202102');

往分区表中添加数据

加上关键字partition(…)指定分区即可;如果没有该分区,则自动新建

load data local inpath'/opt/file.txt' into student partition(month='202102');
insert into student partition(month='202102') values(1,'abc');

查询分区表数据

select * from student where month='202102';
select * from student where month='202102' and day='01';

删除分区

删除一个分区表里的分区

alter table student drop partition(month='202102');

删除多个分区表里的分区(以逗号隔开)

alter table student drop partition(month='202102'),partition(month='202102');

查看所有分区

show partitions student;

修复分区

如果数据是通过HDFS直接上传到分区目录,如果分区没定义,则会查询不到刚上传的数据

修复命令

msck repair table student;

也可以直接让此目录成为分区目录(这里以month='20200316’为例)

alter table student add partition(month='20200316');

2.3 修改表

重命名表

alter table table_name RENAME TO new_table_name

添加列(添加的列在分区字段之前,括号中使用逗号分隔添加多列)

alter table student add columns(gender string);

更新列信息(旧字段名,新字段名,新字段类型)

alter table student change column name name2 string;

替换表中所有字段(将所有字段合并替换为一个字段)

alter table student replace columns(id string,name string,age int);

注:add 是代表新增一字段,字段位置在所有列后面(partition列前),replace 则是表示替换表中所有字段。

2.4 删除表

drop table student;

标签:name,数据库,定义语言,hive,Hive,student,DDL,table,分区
来源: https://blog.csdn.net/qq_42374697/article/details/113821985

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有