1、Database 表空间

    是HDFS的一个文件夹,列出hive中的表空间语句为:show databases     hive默认有一个default表空间。

hive 宽表太大了怎么办 hive表空间_表空间


    默认的数据库存储位置为:/user/hive/warehouse

    位置设置参数为:hive.metastore.warehouse.dir

hive 宽表太大了怎么办 hive表空间_数据_02


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, ...)];

    例:

hive 宽表太大了怎么办 hive表空间_hive_03


     这里创建了一个名为my_datadatabase;

     if not exists的意思是如果不存在就创建,如果存在则不创建。

     另:图中hive客户端后面跟了表空间的名字(default),这里是可以用参数设置的,具体设置参数是在hive-site.xml 里面设置hive.cli.print.current.db

hive 宽表太大了怎么办 hive表空间_数据_04


value设置为true,则会带出当前所在的database。如果不需要,则设置为false。

创建的表空间my_data存在于HDFS路径${hive.metastore.warehouse.dir}/dbname.db

hive 宽表太大了怎么办 hive表空间_hive_05

我们还可以给创建的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的信息

hive 宽表太大了怎么办 hive表空间_数据_06

DROP

想要删除database,语句为drop database my_data2

hive 宽表太大了怎么办 hive表空间_表空间_07


因为my_data2里面是空的,没有表存在,所以可以drop。如果表空间里面存在表,直接删除就会报错。

hive 宽表太大了怎么办 hive表空间_表空间_08


如果表空间里面存在表,想要删除这个表空间,可以先删除里面的表再drop,也可以在删除表空间的语句后面加上cascade,这个关键字的意思是强制删除。但生产环境不建议这么使用

3、TABLE

hive是构建在hadoop之上的,所建的表也存储于hdfs。

创建表的时候要指定分隔符,如空格或者制表符(\t)

如:

hive 宽表太大了怎么办 hive表空间_数据_09


添加数据到emp表中,这里我们用

load data local inpath '/home/hadoop/data/emp.txt' overwrite into table emp;语句从本地上传数据到表中。

hive 宽表太大了怎么办 hive表空间_表空间_10


hive 宽表太大了怎么办 hive表空间_数据_11

数据load成功后,我们查询emp表,里面已经有我们想要的数据。

local的意思是从本地上传文件 如果不加则是从HDFS上传。
overwirte的意思是重写,即如果表里如果已经存在数据,则会先清空原数据再插入。如果不写这个关键字,则是追加数据的意思。

内部表和外部表

内部表:

  hive默认建的是内部表,内部表为hive管理,如果删除内部表,元数据和HDFS上的数据都会被删除。

  如我们上面建的表emp,我们可以用命令desc formatted emp查看其属性

hive 宽表太大了怎么办 hive表空间_表空间_12


hive 宽表太大了怎么办 hive表空间_表空间_13


   如上图,我们可以看到emp表的列名,database,owner,location等信息。注意Table_Type这个参数,为MANAGED_TABLE,意思为内部表。外部表

   建表是加上external关键字,创建的表即为外部表。删除外部表时,元数据被删除,但是数据还是存在于HDFS上的,并没有被删除。

hive 宽表太大了怎么办 hive表空间_hive 宽表太大了怎么办_14


hive 宽表太大了怎么办 hive表空间_hive 宽表太大了怎么办_15

当我们想创建一张相同的表时,可以用命令

create table emp3 as select * from emp;这个语句可以把表结构和数据都拷给emp3。执行语句时,会执行mapreduce任务。

hive 宽表太大了怎么办 hive表空间_hive_16


hive 宽表太大了怎么办 hive表空间_hive_17

如果我们只想复制表结构,可以用

create table emp4 like emp;

hive 宽表太大了怎么办 hive表空间_数据_18