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;