zoukankan      html  css  js  c++  java
  • Hive管理表,外部表及外部分区表的深入探讨

            Hive管理表,也叫内部表。Hive控制着管理表的整个生命周期,默认情况下Hive管理表的数据存放在hive的主目录:/user/hive/warehouse/下,并且当我们删除一张表时,这张表的数据也会相应的被删除掉,在文件层面上讲,就是在Hive主目录下的表目录以及目录里面的数据文件都会被删除掉。

          管理表能够有效的管理表的数据,但是不利于对数据的分享,同一份数据,我希望既能够指向表A,有能够分享给表B,但是相应的这些表不应该控制数据的生命周期,这种表在Hive里面成为外部表。在创建外部表的时候,需要指向数据的具体位置,相当于一个指针,外部表只是引用了数据的地址,访问表时再根据这个地址指针去找到相应的数据。

         在管理大型数据集时,分区是一个有效的解决办法,能够根据分区条件限制访问的数据量大小,能够达到优化数据的访问速度。对于管理管的分区,上节已经详细讲解过了,本节将会针对外部分区表进行讲解。

        1. 管理表创建:

    CREATE TABLE IF NOT EXISTS emp(
    empno STRING,
    ename STRING,
    job STRING,
    mgr STRING,
    hiredate STRING,
    salary DOUBLE,
    comm DOUBLE,
    deptno STRING 
    )
    ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY ' ';

    hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ cat emp
    7369 SMITH CLERK 7902 1980/12/17 1100.00 NULL 20
    7499 ALLEN SALESMAN 7698 1981/2/20 1800.00 300.00 30
    7521 WARD SALESMAN 7698 1981/2/22 1450.00 500.00 30
    7566 JONES MANAGER 7839 1981/4/2 3275.00 NULL 20
    7654 MARTIN SALESMAN 7698 1981/9/28 1450.00 1400.00 30
    7698 BLAKE MANAGER 7839 1981/5/1 3050.00 NULL 30
    7782 CLARK MANAGER 7839 1981/6/9 2450.00 NULL 10
    7788 SCOTT ANALYST 7566 1987/4/19 3300.00 NULL 20
    7839 KING PRESIDENT NULL 1981/11/17 5000.00 NULL 10
    7844 TURNER SALESMAN 7698 1981/9/8 1700.00 NULL 30
    7876 ADAMS CLERK 7788 1987/5/23 1400.00 NULL 20
    7900 JAMES CLERK 7698 1981/12/3 1150.00 NULL 30
    7902 F%FORD ANALYST 7566 1981/12/3 3300.00 NULL 20
    7934 MILLER CLERK 7782 1982/1/23 1300.00 NULL 10

    将数据导入到管理表中:

    hive (jimdb)> LOAD DATA LOCAL INPATH './emp' OVERWRITE INTO TABLE emp;
    Loading data to table jimdb.emp
    Table jimdb.emp stats: [numFiles=1, numRows=0, totalSize=705, rawDataSize=0]
    OK
    Time taken: 0.983 seconds

    查看相应的数据文件,文件目录如下:

    hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hdfs dfs -ls /user/hive/warehouse/jimdb.db/emp
    Found 1 items
    -rwxr-xr-x 2 hadoop supergroup 705 2018-06-12 06:27 /user/hive/warehouse/jimdb.db/emp/emp

    删除管理表emp

     hive (jimdb)> drop table emp;

    OK
    Time taken: 1.793 seconds

    然后到数据库目录下查看表目录以及数据文件:

    hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hdfs dfs -ls /user/hive/warehouse/jimdb.db/
    Found 8 items
    drwxr-xr-x - hadoop supergroup 0 2018-06-05 07:15 /user/hive/warehouse/jimdb.db/dept
    drwxr-xr-x - hadoop supergroup 0 2018-06-06 08:10 /user/hive/warehouse/jimdb.db/dual
    drwxr-xr-x - hadoop supergroup 0 2018-06-10 21:01 /user/hive/warehouse/jimdb.db/emp_test
    drwxr-xr-x - hadoop supergroup 0 2018-06-07 15:58 /user/hive/warehouse/jimdb.db/employees
    drwxr-xr-x - hadoop supergroup 0 2018-06-02 05:56 /user/hive/warehouse/jimdb.db/employees_external_table
    drwxr-xr-x - hadoop supergroup 0 2018-06-12 02:35 /user/hive/warehouse/jimdb.db/family
    drwxr-xr-x - hadoop supergroup 0 2018-06-07 23:51 /user/hive/warehouse/jimdb.db/test1
    drwxr-xr-x - hadoop supergroup 0 2018-06-10 19:26 /user/hive/warehouse/jimdb.db/udtf_test

    从在数据库jimdb目录下查看的结果看,表目录以及数据文件已经完全删除掉了,所以对于管理表,能够有效的控制数据的生命周期,管理表和管理分区表在数据仓库中是应用最多的表类型。

    2. 外部表举例

    hive (jimdb)> --外部表
    > CREATE EXTERNAL TABLE IF NOT EXISTS department(
    > deptno STRING,
    > dname STRING,
    > loc STRING
    > )
    > ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
    > LOCATION '/data/dept';
    OK
    Time taken: 0.318 seconds

    外部表指向的这个目录下的数据文件内容如下:

    hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hadoop fs -cat /data/dept/dept
    50 HR XIAN
    10 ACCOUNTING NEW YORK
    20 RESEARCH DALLAS
    30 SALES CHICAGO
    40 OPERATIONS BOSTON

    现在对该表进行查询:

    hive (jimdb)> SELECT * FROM department;;
    OK
    department.deptno department.dname department.loc
    50 HR XIAN
    10 ACCOUNTING NEW YORK
    20 RESEARCH DALLAS
    30 SALES CHICAGO
    40 OPERATIONS BOSTON
    Time taken: 0.163 seconds, Fetched: 5 row(s)

    可以通过DESC(RIBE) EXTENDED  tablename对外部表的详细信息进行查看:

    hive (jimdb)> DESC EXTENDED department;
    OK
    col_name data_type comment
    deptno string 
    dname string 
    loc string 

    Detailed Table Information Table(tableName:department, dbName:jimdb, owner:hadoop, createTime:1528811524, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:deptno, type:string, comment:null), FieldSchema(name:dname, type:string, comment:null), FieldSchema(name:loc, type:string, comment:null)], location:hdfs://192.168.178.134:9000/data/dept, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{field.delim= , serialization.format=
    Time taken: 0.167 seconds, Fetched: 5 row(s)

    外部表的查询和管理表时没有任何区别的,但是在删除表后,数据文件是不会被删除掉的,如下:

    hive (jimdb)> drop table department;
    OK
    Time taken: 0.262 seconds

    hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hadoop fs -cat /data/dept/dept
    50 HR XIAN
    10 ACCOUNTING NEW YORK
    20 RESEARCH DALLAS
    30 SALES CHICAGO
    40 OPERATIONS BOSTON

    外部表已经删除,但是数据文件没有受到影响。

    3. 外部分区表

    外部表也可以使用分区。在定义外部表时,必须定义一个LOCATION子句的数据文件目录,而对于外部分区表,不需要定义这个LOCATION子句,有一个ALTER TABLE XX ADD PARTITION ....LOCATION....语句在添加分区时定义这个分区的数据文件的目录。

    创建一张某班级月考的学生成绩表

    hive (jimdb)> CREATE EXTERNAL TABLE IF NOT EXISTS month_grade(
    > stu_no INT,
    > name STRING,
    > grade_sum STRING)
    > PARTITIONED BY(year INT,month INT)
    > ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';
    OK
    Time taken: 0.371 seconds

    hive (jimdb)> ALTER TABLE month_grade ADD PARTITION(year=2018,month=1)
    > LOCATION 'hdfs://192.168.178.134:9000/data/2018/1';
    OK
    Time taken: 0.972 seconds
    hive (jimdb)> ALTER TABLE month_grade ADD PARTITION(year=2018,month=2)
    > LOCATION 'hdfs://192.168.178.134:9000/data/2018/2';
    OK
    Time taken: 0.32 seconds
    hive (jimdb)> 
    > ALTER TABLE month_grade ADD PARTITION(year=2018,month=3)
    > LOCATION 'hdfs://192.168.178.134:9000/data/2018/3';
    OK
    Time taken: 0.289 seconds
    hive (jimdb)> 
    > ALTER TABLE month_grade ADD PARTITION(year=2018,month=4)
    > LOCATION 'hdfs://192.168.178.134:9000/data/2018/4';
    OK
    Time taken: 0.195 seconds

    可以删除掉分区,但是分区对应的数据不受影响,因为这是外部表的一个分区指向到了数据的路径。

    hive (jimdb)> ALTER TABLE month_grade DROP PARTITION(year=2018,month=4);
    OK
    Time taken: 0.256 seconds

    查看该分区对应的数据文件:

    hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hadoop fs -cat /data/2018/4/month_grade4
    1000 liuhua 546
    1001 dongqign 600
    1002 tangtang 549
    1003 qigngua 499
    1004 liuhua 700
    1005 liudongdong 609

    数据文件还存在,因此说明外部表的分区的删除对数据文件没影响。

    要删除数据文件,可以使用 hadoop fs  -rm -r  /data/2018/4 将这个目录下的文件都删除掉;

    hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hadoop fs -rmr /data/2018/4/
    rmr: DEPRECATED: Please use '-rm -r' instead.
    Deleted /data/2018/4

  • 相关阅读:
    chrome 浏览器安装 postman
    react + antd Form表单校验
    Java 获取日期间的日期 & 根据日期获取星期
    PostgreSQL 按照日期范围查询
    momentjs 学习
    npm 常用命令
    Web中的安全性问题
    (转)Java 详解 JVM 工作原理和流程
    HashMap的工作原理
    对于org.apache.commons.dbcp.BasicDataSource的配置认知
  • 原文地址:https://www.cnblogs.com/nanshanjushi/p/9175595.html
Copyright © 2011-2022 走看看