1、Database 表空间
是HDFS的一个文件夹,列出hive中的表空间语句为:show databases
hive默认有一个default表空间。
默认的数据库存储位置为:/user/hive/warehouse
位置设置参数为:hive.metastore.warehouse.dir
2、DDL : Data Definition Language
create、delete、alter、drop关键字
创建表空间
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
例:
这里创建了一个名为my_data的database;
if not exists的意思是如果不存在就创建,如果存在则不创建。
另:图中hive客户端后面跟了表空间的名字(default),这里是可以用参数设置的,具体设置参数是在hive-site.xml 里面设置hive.cli.print.current.db
value设置为true,则会带出当前所在的database。如果不需要,则设置为false。
创建的表空间my_data存在于HDFS路径${hive.metastore.warehouse.dir}/dbname.db
如
我们还可以给创建的database给个描述,创建语句为
CREATE DATABASE IF NOT EXISTS my_data2
COMMENT 'this is my second database'
WITH DBPROPERTIES ('creator'='my', 'date'='20151314');
创建好以后,用desc database extended my_data2
查询信息,可以看到我们刚才创建的my_data2的信息
DROP
想要删除database,语句为drop database my_data2
因为my_data2里面是空的,没有表存在,所以可以drop。如果表空间里面存在表,直接删除就会报错。
如果表空间里面存在表,想要删除这个表空间,可以先删除里面的表再drop,也可以在删除表空间的语句后面加上cascade
,这个关键字的意思是强制删除。但生产环境不建议这么使用。
3、TABLE
hive是构建在hadoop之上的,所建的表也存储于hdfs。
创建表的时候要指定分隔符,如空格或者制表符(\t)
如:
添加数据到emp表中,这里我们用
load data local inpath '/home/hadoop/data/emp.txt' overwrite into table emp;
语句从本地上传数据到表中。
数据load成功后,我们查询emp表,里面已经有我们想要的数据。
local
的意思是从本地上传文件 如果不加则是从HDFS上传。overwirte
的意思是重写,即如果表里如果已经存在数据,则会先清空原数据再插入。如果不写这个关键字,则是追加数据的意思。
内部表和外部表
内部表:
hive默认建的是内部表,内部表为hive管理,如果删除内部表,元数据和HDFS上的数据都会被删除。
如我们上面建的表emp,我们可以用命令desc formatted emp
查看其属性
如上图,我们可以看到emp表的列名,database,owner,location等信息。注意Table_Type这个参数,为MANAGED_TABLE,意思为内部表。外部表
建表是加上external关键字,创建的表即为外部表。删除外部表时,元数据被删除,但是数据还是存在于HDFS上的,并没有被删除。
当我们想创建一张相同的表时,可以用命令
create table emp3 as select * from emp;
这个语句可以把表结构和数据都拷给emp3。执行语句时,会执行mapreduce任务。
如果我们只想复制表结构,可以用
create table emp4 like emp;