Hive基础指令--笔记

命令

作用

额外说明

show  databases;

查看都有哪些数据库

就像sql语言中的一样,以下空白说明和Mysql数据库一样

create database park;

创建park数据库

创建的数据库,实际是在Hadoop的HDFS文件系统里创建一个目录节点,统一存在: /user/hive/warehouse 目录下

 

use  park;

进入park数据库

 

show tables;

查看当前数据库下所有表

 

create table stu

 (id int,name string);

创建stu表,以及相关的两个字段

hive里,用的是string,不用char和varchar。此外,所创建的表,也是HDFS里的一个目录节点

 

 

insert into stu values(1,'zhang')

向stu表插入数据

1.HDFS不支持数据的修改和删除,但是在2.0版本后支持了数据追加。实际上,insert into 语句执行的是追加操作。
2.所以注意:hive支持查询,行级别的插入。不支持行级别的删除和修改。

3.hive的操作实际是执行一个job任务,调用的是Hadoop的MR。
 

 


4.插入完数据之后,发现HDFS stu目录节点下,多了一个文件,文件里存了插入的数据,所以得出结论,hive存储的数据,是通过HDFS的文件来存储的。

select * from stu

查看表数据

也可以根据字段来查询,比如select  id from stu

drop table stu

删除表

 

select  * from stu

查询stu表数据

有时会出现这样的情况:
 

 

原因是:我们从外部导入的文件的数据格式是:

1 jary

2 rose

即第一列和第二列是以空格为分隔符的。

但是把数据导入到hive之后,hive并不知道分隔符是什么,所以就不能正确的切分数据。所以显示null。

解决办法:在hive创建表的时候,要指定分割符,并且这个分割符要和外部文件里的分割符一致。详见指令8

load data local inpath '/home/software/1.txt' into table stu;

通过加载文件数据到指定的表里

 

在执行完这个指令之后,发现hdfs stu目录下多了一个1.txt文件。由此可见,hive的工作原理实际上就是在管理hdfs上的文件,把文件里数据抽象成二维表结构,然后提供hql语句供程序员查询文件数据。
可以做这样的实验:不通过load 指令,而通过插件向stu目录下再上传一个文件,看下hive是否能将数据管理到stu表里。

 

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

 

创建stu1表,并指定分割符 空格。

此时,把外部数据导入hive,就可以正确查出数据了。

 

 

desc  stu

查看 stu表结构

 

create table stu2 like stu

创建一张stu2表,表结构和stu表结构相同

 like只复制表结构,不复制数据

insert  overwrite  table stu2  select * from stu

把stu表数据插入到stu2表中

insert  overwrite 可用于将select 查询出的数据插入到指定的表中或指定的目录下

比如:把查询结果存到本地指定的目录下,

执行:insert overwrite local directory '/home/stu' row format delimited fields terminated by  '  ' select * from stu;

也可以将查询结果存到HDFS文件系统上

执行:insert overwrite directory '/stu' row format delimited fields terminated by  '  '  select * from stu;

也可以将查询结果插入到多张表中

执行:from stu insert overwrite table stu1 select * insert overwrite table stu2 select *;
结果是把stu表的数据插入 stu1stu2 表。(也可以加where 条件等,比如select * where id>3

alter table  stu rename to stu2

为表stu重命名为stu2

 

 

alter table stu add columns (age int);

为表stu增加一个列字段age,类型为int

 

exit

退出hive

当退出hive后,我们可以尝试做这样的一件事:
之前我们是在bin目录执行:sh hive 进入的
现在,我们换一个目录来进入hive,比如: sh /bin/hive 来进入
当我们查看数据库或查看表时,发现之前建立的park和stu表都没有了。

原因:hive可以管理hdfs上的文件,用表的形式来管理文件数据。

而表名、表里有哪些字段,字段类型、哪张表存在哪个数据下等这些表信息,称之为hive的元数据信息。

知识点:hive的元数据信息不是存在hdfs上的,而是存在hive自带的derby关系型数据库里的。

即hive管理的数据是在hdfs上的,hive的元数据信息是存在关系型数据库里的。

 

上述问题出现的原因就是由于derby数据库引起的,这个数据库功能不完善,仅用于测试。

derby数据库存储hive元数据的方式:当在bin目录下进入hive时,derby数据会在bin目录下生成一个metastore_db目录,将元数据信息存在这个目录下。

当换个目录,比如在home 目录下hive时,derby又会在home目录下生成一个metastore_db目录,存储元数据信息。

 

解决办法:将默认使用的derby数据库换成mysql数据库

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值