返回 导航

大数据

hangge.com

Hive - 快速入门教程2(数据库和表的操作命令)

作者:hangge | 2024-09-10 08:50

一、数据库的操作

1,查看数据库列表

show databases;

2,选择数据库

use default;

3,创建数据库

create database mydb1;

4,删除数据库

注意Hive 中的 default 默认数据库无法被删除。
drop database mydbl;

二、表的操作

1,创建表

(1)下面命令创建一张只包含一列的表 t2
create table t2(id int);

(2)在实际工作中,表中会有多个列,所以在创建表时需要指定表对应的数据中列和行的分隔符,否则 Hive 是无法正确识别的。下面命令创建一个包含多个列的表“t3”:
  • 使用 row format delimited 来自定义表数据的解析规则
  • 通过 fields terminated by 指定列之间的分隔符
  • 通过 lines terminated by 指定行之间的分隔符
注意lines terminated by 这个行分隔符的定义可以忽略不写,默认是“\n”。如果要写,则只能写到最后面,否则语法会报错。
create table t3 (
    id int,
    stu_name string,
    stu_birthday date,
    online boolean
)
row format delimited
fields terminated by '\t'
lines terminated by '\n';

(3)在建表时使用用 comment 关键字可以给给字段,以及表本身增加注释:
提示:如果发现添加的中文注释显示乱码,可以参考我写的另一篇文章进行解决:
create table t5(
  age int comment '年龄'
) comment '测试';

2,查看当前数据库中所有的表名

show tables;

3,查看表结构信息

desc t2;

4,查看表的创建信息

show create table t2;

5,加载数据

(1)假设 /usr/local/t2.txt 文件中的内容如下:
  • 执行如下命令可以将 /usr/local/t2.txt 文件加载到表 t2 中。
注意:在 load 命令后面可以指定本地 Linux 路径或者 HDFS 路径,本地 Linux 路径需要使用 local 参数,HDFS 路径则不需要添加 local 参数。
load data local inpath '/usr/local/t2.txt' into table t2;

(2)下面是多列数据导入样例,假设 /usr/local/t3.txt 文件中的内容如下:
  • 执行如下命令可以将 /usr/local/t3.txt 文件加载到表 t3 中。
注意t3.data 文件中的多列数据之间的分隔符,必须和建表语句中 fields terminated by 指定的分隔符一致。
load data local inpath '/usr/local/t3.txt' into table t3;

(3)我们知道 hive 表中的数据最终是存储在 hdfs 上的,比如 t3 表数据默认就是在 hdfs/user/hive/warehouse/t3 目录下。因此,我们也可以直接手工通过 put 命令把数据上传到该目录中:
hdfs dfs -put /usr/local/t3.txt /user/hive/warehouse/t3/t3_bak.txt
  • hdfs 上确认一下,可以看到刚才上传的文件:
  • 再查询一下这个表的数据,可以发现数据多了一份,说明刚才使用 hdfsput 命令上传的是可以的:

6,查看表中数据

(1)下面命令查看表 t2 中的所有数据:
select * from t2;
注意:由于此时是全表扫描,所以 Hive 底层没有产生 MapReduce 任务。如果是复杂的 SQL,则在执行时会产生 MapReduce 任务。

(2)下面命令查看表 t3 中的所有数据:
select * from t3;
注意Hive 在读取数据时,如果遇到无法识别的数据则会显示 NULL,不会导致读取失败。这是 Hive 的特性:它不会提前检查数据,只有在使用时才会检查数据,如果数据有问题则显示 NULL

7,删除表

对于不需要使用的表,可以使用 drop 命令将其删除。
drop table t3;

8,修改表名

alter table t2 rename to t2_bak;

9,增加表字段

下面代码我们给 t2 表增加一个 name 字段。
注意:新增字段后重新查看表结构信息,再查询一下这个表中的数据,结果发现,第二列为 null。这是正常的,因为我们的数据数据文件中就只有一列,第二列查询不到,就显示为 null,不会报错,这一点要注意一下。
alter table t2 add columns (name string);

附:Hive 数据在 HDFS 上如何体现的?

1,默认数据库 HDFS 上的体现

    我们知道 hive 的数据都是存储在 hdfs 上,在 hive-site.xml 中有一个参数 hive.metastore.warehouse.dir,它的默认值是 /user/hive/warehouse,表示 hivedefault 默认数据库对应的 hdfs 存储目录。

2,新建数据库在 HDFS 上的体现

(1)我们自己创建一个名为 mydbl 的数据库:
create database mydb1;
  • 这个数据库同样是在 hdfs/user/hive/warehouse 目录下:
  • metastore 中确认一下,可以看到这里面记录着数据库对应的 HDFS 目录地址:

(2)如果不希望创建的数据库在这个目录下面,想要手工指定,那也是可以的,在创建数据库的时候通过 location 来指定 hdfs 目录的位置。
create database mydb2 location '/user/hive/mydb2';
  • HDFS 上确认一下,可以看到数据库以及存放到我们指定的 hdfs 目录位置下了:

3,表在 HDFS 上的体现

(1)我们通过 Hive 在默认数据库下创建一张 t1
create table t1(id int);

(2)然后到 HDFS 上看一下,发现确实有这个目录,并且这个目录下还有一个 t1 目录,其实这个 t1 就是我们在 default 数据库中创建的那个 t1 表。从这可以看出来,hive 中的数据库和 hive 中的表,在 hdfs 上面的体现其实都是目录。

(3)注意:表中的数据是存储在 hdfs 中的,但是表的名称、字段信息是存储在 metastore 中的。到 metastore 中看一下,先看 tbls 表,这个里面中存储的都是在 hive 中创建的表,TBL_NAME 是这个表的名称。而 DB_ID1,可以到 dbs 表中看到默认 default 数据库的 id 就是 1

(4)在表 COLUMNS_V2 中存储的是 Hive 表的字段信息(包含字段注释、字段名称、字段类型、字段顺序)其中的 CD_IDtbls 中的 TBL_ID 相等

(5)如果我们对表名进行重命名,可以发现 hdfs 中对应的目录名称也同步变化了。
alter table t2 rename to t2_bak;
评论

全部评论(0)

回到顶部