1.建库
hive中有一个默认的库:
库名:default
库目录:hdfs://marshal:9000/user/hive/warehouse
新建库:
create database db_order;
我们的数据库在DBS中可以看到:
库建好后,在hdfs中会生成一个库目录,目录名为库名.db
2.基本建表语句
use db_order;
create table t_order(id string,create_time string,amount float,uid string);
表建好后,会在所属的库目录中生成一个表目录:
但是刚才的建表语句其实是不完整的,我们如果放数据进去就会出问题。只是这样建表的话,hive会认为表数据文件中的字段分隔符为:^A。
如果我们以逗号为分割符的话,就会出现这样的状况。
hdfs dfs -put order.data.1 /user/hive/warehouse/db_order.db/t_order
正确的建表语句为:
create table t_order(id string,create_time string,amount float,uid string)
row format delimited //这里为固定格式,意思是要开始指定分隔符了
fields terminated by ','; //这样就指定了表数据文件中的字段分隔符为逗号。
我们先把原来的表删除:
删除表的效果是:hive会从元数据库中清楚关于这个表的信息,hive还会从hdfs中删除这个表的表目录。
再次上传文件:
hdfs dfs -put order.data.1 /user/hive/warehouse/db_order.db/t_order/
进行查询:
内部表导入:
方式一:手动用hdfs命令,将文件放入表目录,即前面我们的做法。
方式二:在hive的交互式shell中,用hive命令导入数据到表目录。
load data local inpath '/root/order.data.2' into table t_order;
//这里如果文件在本地目录的话就要加上local但是如果这个文件已经在hdfs目录中了,就不用加local
这样我们再去查询的话就会有8条数据:
我们前面使用的表都是内部表,我们可以在数据库中查看一下表的描述:
那么MANAGED_TABLE是什么意思呢?意思就是表的目录是按照hive的规则放在固定的地方。
那么我们可不可以将表目录放在hdfs任何路径下呢?可以的。但是这样的表就成了外部表。
所以
内部表:表目录按照hive的规范来部署,位于hive的仓库目录/user/hive/warehouse中
外部表:表目录由建表用户自己指定。
create external table t_access(ip string,url string,access_time string)
row format delimited
fields terminated by ','
location '/access/log';
建立外部表的含义有很多,比如我们可以和日志采集系统的目录关联起来,这样就会有源源不断的新数据进来供我们分析。
我们再来看看表的描述,这时候就不一样了:
查询结果:
外部表和内部表的特性区别:
1.内部表的目录在hive仓库目录中,外部表的目录有用户指定。
2.删除一个内部表时:hive会清除相关元数据,并删除表目录
3.删除一个外部表时:hive只会清除相关元数据
所以外部表对于数据来说是比较安全的。