4.hive的外部表和内部表

1.外部表和内部表区别

  1. 创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。
  2. 删除表时:在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
  3. hive默认创建的是内部表
  4. 外部表比内部表更加安全
  5. 在删除内部表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!

2. 内部表

  1. 创建表

    CREATE TABLE emp
    (
    name string,
    arr ARRAY<string>,
    stru1 STRUCT<sex:string,age:int>,
    map1 MAP<string,int>,
    map2 MAP<string,ARRAY<string>>
    )
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '|'	       //字段分隔符
    COLLECTION ITEMS TERMINATED BY ','
    MAP KEYS TERMINATED BY ':'    //map的kv之间分隔符
    LINES TERMINATED BY '\n';    //集合元素分隔符
    
    
  2. 将数据导入hdfs

    # hdfs dfs -put hive.data /user/
    # hdfs dfs -ls /user/hive.data
    -rw-r--r--   3 root supergroup        229 2017-07-15 11:26 /user/hive.data
    
  3. 导入数据到表里

    0: jdbc:hive2://localhost:10000> load data inpath "/user/hive.data" into table emp;
    
  4. 查看hdfs里的变化

    # hdfs dfs -ls /user/
    -rw-r--r--   3 root supergroup        229 2017-07-15 11:26 /user/hive
    # 内部表导入数据相当于mv 将数据移动到自己的表目录里
    
    # hdfs dfs -ls /user/hive/warehouse/emp
    Found 1 items
    -rwxr-xr-x   3 root supergroup        229 2017-07-15 11:26 /user/hive/warehouse/emp/hive.data
    
  5. 删除表

    0: jdbc:hive2://localhost:10000> drop table emp;
    No rows affected (0.373 seconds)
    
  6. 查看hdfs里的数据

    # hdfs dfs -ls /user/hive/warehouse/
    Found 1 items
    drwxr-xr-x   - root supergroup          0 2017-07-12 10:53 /user/hive/warehouse/liuyao.db
    # emp表和数据已经被删除
    

3. 外部表

  1. 复制表方式创建外部表

    $beeline>create external table ext_emp like emp ;
    $beeline>create external table ext_emp as select * from emp ;
    $beeline>create external table ext_emp like emp ;
    
  2. 复制数据

    $beeline>insert into ext_emp select * from emp ;
    
  3. 重命名

    $beenline>alter table ext_emp rename to ext_emp2 ;
    
  4. 启动表删除保护,离线保护

    jdbc:hive2://> ALTER TABLE ext_emp ENABLE NO_DROP;
    jdbc:hive2://> ALTER TABLE c_employee DISABLE NO_DROP;
    jdbc:hive2://> ALTER TABLE c_employee ENABLE OFFLINE;
    jdbc:hive2://> ALTER TABLE c_employee DISABLE OFFLINE;
    
posted @ 2017-07-15 23:41  刘耀  阅读(1333)  评论(0编辑  收藏  举报