Hive数据定义与操作

Posted shi_zi_183

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive数据定义与操作相关的知识,希望对你有一定的参考价值。

Hive数据定义与操作

HiveQL数据定义语言

创建数据库

create database sogou;

如果数据库sogou已经存在的话,会抛出异常,创建数据库的命令应为

create database if not exists sogou;

查看数据库

随时可以通过如下命令查看Hive中所包含的数据库

show databases;


数据多的时候,可以使用正则表达式来筛选

show databases like 's.*';

为数据库增加描述,以说明该数据库的业务含义

create database bank comment 'Internet Banking';  //创建数据库bank,其作为电子网银系统后台数据库
describe database bank;  //查看数据库bank的详细信息


数据库拓展名为.db,存放目录为:hdfs://master:9000/user/hive/warehouse/bank.db,该父目录层级在Hive的配置文件hive-site.xml中进行hive.metastore.warehouse.dir属性值的自定义设置。
Hive创建新的数据库时,Hive为每个数据库创建一个目录

删除数据库

drop database sogou;
drop database database if exists sogou;

Hive数据仓库不允许删除一个包含有表的数据库

先删除数据库中的表再删除数据库
创建测试表

create database if not exists book_sale;
use book_sale;
create table if not exists book_sale.book(id_book int ,name_book string)row format delimited fields terminated by ',';


drop table if exists book;
drop database if exists book_sale;


在删除数据库的命令后加上关键字cascade

drop database if exists book_sale cascade;

HiveQL数据定义语言

创建表

Hive数据仓库提供了类似关系型数据库的表结构存储,可以创建数据库,然后基于数据库来创建表应用,最后通过表来管理业务数据。

create table if not exists enterprise.account(acc_name string, acc_balance double) row format delimited fields terminated by '\\t' location '/user/hive/warehouse/enterprise.db/account';

创建表

在Hive中按照表数据的生命周期可以将表分为内部表和外部表两大类

管理表(内部表;临时表)

Hive控制着管理表的整个生命周期,默认情况下Hive管理表的数据存放在Hive主目录/user/hive/warehouse/中,当删除一张表时,表中的数据一起被删除。
以前建立的enterprise数据库中的表都属于管理表
管理表的缺陷:删除表时,表中数据也被删除。

外部表(在实际业务系统中常用)

在创建表时,加上关键字external,则创建外部表。
外部表中的数据生命周期不受Hive的控制,可以和其他外部表进行数据共享,当删除一张外部表时,表对应的数据不会被删除。

create external table product(pro_name string, pro_price double)row format delimited fields terminated by ' ' location '/data/stocks';
load data local inpath '/home/hadoop/product.txt' into table product;
select * from product;
dfs -ls /data/stocks/;
show tables;
drop table product;
show tables in enterprise;
dfs -ls /data/stocks;



外部表通常用在关键信息表中,即使删除了表,数据依然存在,重新创建表后,表中数据就恢复了。
另外在公用数据表中可以保证数据安全
共用表实现

create external table product(pro_name string, pro_price double)row format delimited fields terminated by ' ' location '/data/stocks';
create external table product_copy(pro_name string, pro_price double)row format delimited fields terminated by ' ' location '/data/stocks';
load data local inpath '/home/hadoop/product.txt' into table product;
select * from product_copy;

修改表

重命名表

alter table employee rename to emp;

更改表的字段和类型

alter table emp change id myid string;

增加一列

alter table emp add columns(dept String comment 'Department name');

删除表

外部表只删除表,不删除数据。如果删除数据,可以删除数据所在的hdfs文件夹

drop table emp;
//如果外部表,需要删除hdfs中的数据

分区表

解决数据库存储和计算机性能能够采取的措施:
1)创建分表
把一张大表数据根据业务需求分配到多张小表中。
优点:提高表的并发量
缺点:SQL代码维护成本增高。
2)创建分区表
所有数据在一张表中,底层物理存储数据根据一定的规划划分到不同的文件中,这些文件可以存储在不同的磁盘上。
优点:分散了存储压力。
缺点:没有提供表的并发量。
Hive的分区方式是在HDFS文件系统上的一个分区名对应一个目录名,子分区名就是子目录名,并不是一个实际字段。
Hive的分区是在创建表的时候用partitioned by关键字定义的。patitioned by定义的列是表中正规的列,但Hive下的数据文件中并不包含这些列,因为定义只是目录名。

静态分区

create table customer_partition(name string,age int)partitioned by(sex string)row format delimited fields terminated by '\\t';
load data local inpath '/home/hadoop/customer.txt' into table customer_partition partition(sex='man');
dfs -ls -R /user/hive/warehouse/enterprise.db/customer_partition;



一张表有多个分区

create table customer_partition_multi(name string,age int)partitioned by(sex string,native string)row format delimited fields terminated by '\\t';
load data local inpath '/home/hadoop/customer.txt' into table customer_partition_multi partition(sex='man',native='Gansu');
dfs -ls -R /user/hive/warehouse/enterprise.db/customer_partition_multi;


动态分区(实际使用)

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions.pernode=1000;
create external table customer_1(name string,age int,sex string,native string)row format delimited fields terminated by ' ' location '/data/customer_1';
load data local inpath '/home/hadoop/customer_1.txt' into table customer_1;
create external table customer_partition_1(name string,age int)partitioned by(sex string,native string)row format delimited fields terminated by ' ';
insert overwrite table customer_partition_1 partition(sex,native)select name,age,sex,native from customer_1;
dfs -ls -R /user/hive/warehouse/enterprise.db/customer_partition_1;





HiveQL数据操作

向管理表中装载数据

create database sogou;
use sogou;
create table if not exists sogou.sogou_500w(ts string,uid string,keyword string,rank string,orders int,url string)row format delimited fields terminated by '\\t' stored as textfile;
load data local inpath '/home/hadoop/sogou.500w.utf8'overwrite into table sogou.sogou_500w;
select * from sogou.sogou_500w limit 5;

经查询语句向表中插入数据

create table if not exists sogou.sogou_xj(ts string,uid string,keyword string,rank string,orders int,url string)row format delimited fields terminated by '\\t';
insert overwrite table sogou.sogou_xj select * from sogou.sogou_500w where keyword like '%仙剑奇侠传%';
select * from sogou.sogou_xj limit 10;

单个查询语句中创建表并加载数据

create table sogou.sogou_xj_backup as select * from sogou.sogou_xj;
select * from sogou.sogou_xj_backup limit 10;

导入数据

Hive表中的数据最终落地在HDFS文件系统上,可以通过HDFS的命令操作直接将数据写入Hive表LOCALTION属性所指向的地址。

导出数据

从Hive导出数据到本地是从HDFS导出数据。

以上是关于Hive数据定义与操作的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记Hive —— Hive应用—— 数据库定义创建表

hive自定义函数开发与部署

hive自定义函数开发与部署

VSCode自定义代码片段——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程