4.hive的外部表和内部表
1.外部表和内部表区别
- 创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。
- 删除表时:在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
- hive默认创建的是内部表
- 外部表比内部表更加安全
- 在删除内部表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!
2. 内部表
-
创建表
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'; //集合元素分隔符
-
将数据导入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
-
导入数据到表里
0: jdbc:hive2://localhost:10000> load data inpath "/user/hive.data" into table emp;
-
查看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
-
删除表
0: jdbc:hive2://localhost:10000> drop table emp; No rows affected (0.373 seconds)
-
查看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. 外部表
-
复制表方式创建外部表
$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 ;
-
复制数据
$beeline>insert into ext_emp select * from emp ;
-
重命名
$beenline>alter table ext_emp rename to ext_emp2 ;
-
启动表删除保护,离线保护
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;