hive> CREATE TABLE hT1(id INT,name STRING,hobby ARRAY
,address MAP ) > ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
> COLLECTION ITEMS TERMINATED BY '-'
> MAP KEYS TERMINATED BY ':';
OK
Time taken: 0.22 seconds
hive> show tables;
OK
ht1
Time taken: 0.066 seconds, Fetched: 1 row(s)
说明:每一行的数据定义为’,’来分割,Collection的条目以’-’来分割,Map的条目以’:’来分割。
可以看到表已经创建成功了。
去WEB UI中查看
加载数据:
id,name,hobby,address
1,张三,篮球-足球-音乐,北京:上海
2,李四,看书-旅游-爬山,西安:成都
3,王五,钢琴-小提琴-古筝,重庆:杭州
4,赵六,抽烟-喝酒-烫头发,哈尔滨:沈阳
hive> LOAD DATA LOCAL INPATH '/root/data/hdata1' INTO TABLE ht1;
Loading data to table default.ht1
Table default.ht1 stats: [numFiles=1, totalSize=207]
OK
Time taken: 2.362 seconds
说明: local代表数据来自与本地磁盘,如果是来自hdfs的话,则去掉local。
查看ht1表中的数据:
hive> select * from ht1;
OK
NULL name ["hobby"] {"address":null}
1 张三 ["篮球","足球","音乐"] {"北京":"上海"}
2 李四 ["看书","旅游","爬山"] {"西安":"成都"}
3 王五 ["钢琴","小提琴","古筝"] {"重庆":"杭州"}
4 赵六 ["抽烟","喝酒","烫头发"] {"哈尔滨":"沈阳"}
Time taken: 0.752 seconds, Fetched: 5 row(s)
同样可以用hadoop命令查看hdfs上的这些数据:
[root@unisk01 ~]# hadoop fs -cat /user/hive/warehouse/htest.db/ht1/*
id,name,hobby,address
1,张三,篮球-足球-音乐,北京:上海
2,李四,看书-旅游-爬山,西安:成都
3,王五,钢琴-小提琴-古筝,重庆:杭州
4,赵六,抽烟-喝酒-烫头发,哈尔滨:沈阳
hive> CREATE EXTERNAL TABLE hET1(id INT,name STRING,hobby ARRAY
,address MAP ) > ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
> COLLECTION ITEMS TERMINATED BY '-'
> MAP KEYS TERMINATED BY ':'
> LOCATION '/hive/external/hET1';
OK
Time taken: 0.299 seconds
hive> desc formatted hET1;
OK
# col_name data_type comment
id int
name string
hobby array
address map
# Detailed Table Information
Database: default
Owner: root
CreateTime: Sat Aug 04 09:56:19 CST 2018
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://mycluster/hive/external/hET1
Table Type: EXTERNAL_TABLE
Table Parameters:
EXTERNAL TRUE
transient_lastDdlTime 1533347779
# Storage Information
SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat: org.apache.hadoop.mapred.TextInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
colelction.delim -
field.delim ,
mapkey.delim :
serialization.format ,
Time taken: 0.156 seconds, Fetched: 33 row(s)
说明:创建表时加上一个External字段,意思是外部表,并且最后加上Location用来指定外部表存放目录。通过查看表格式的命令,可以查看详细的内容。
查看WEB UI发现外部表的数据并没有在hive自己仓库的目录下
外部表和内部表的区别:
它两主要区别在于LOAD和DROP这两个命令语义上:
内表使用load命令会把数据移到自己仓库目录下
外表使用load命令会把数据移到自己仓库以外的位置
内表使用drop命令会把元数据和数据一起删除(这也就是为什么内表也叫托管表)
外表使用load命令只会删除元数据
到底该选择哪一种方式呢?
有一个经验法则:
如果所有处理都由hive完成,应使用内表
如果要用hive和其他工具来处理同一个数据集应该使用外表
经常的使用场景:
把存在HDFS上的初始数据集用作外部表进行使用,然后用hive的变换功能把数据迁移到托管hive的表。
所以我们试着删除外部表:
hive> drop table hET1;
OK
Time taken: 0.206 seconds
hive> show tables;
OK
ht1
Time taken: 0.063 seconds, Fetched: 1 row(s)
hive>
然后去HDFS目录中查看
[root@unisk01 ~]# hadoop fs -cat /hive/external/tET1/*
id,name,hobby,address
1,张三,篮球-足球-音乐,北京:上海
2,李四,看书-旅游-爬山,西安:成都
3,王五,钢琴-小提琴-古筝,重庆:杭州
4,赵六,抽烟-喝酒-烫头发,哈尔滨:沈阳
[root@unisk01 ~]#
的确数据依然存在,那么再看一下删除内部表:
去WEB UI查看,也的确看到这个数据文件依然存在
hive> drop table ht1;
OK
Time taken: 2.05 seconds
hive> show tables;
OK
Time taken: 0.05 seconds
hive>
然后去HDFS目录中查看:
发现htest.db库下已经没有ht1表了。