一、管理表(内部表)
我们目前所创建的表都是所谓的管理表也叫内部表,不过好像大部分人都叫内部表,因为这种表,hive会控制hive数据的周期,而且他会把内部表默认配置项hive.metastore.warehouse.dir(默认存储在hdfs的/user/hive/warehose/)目录下。但我们删除一个内部表时,hive也会删除这个表中的数据。但是管理表不方便和其他工作共享数据,同时我们还想使用hive这份数据上执行一些查询,可是并没有给予hive对数据的所有权,我们可以创建一个外部表指向这份数据,并不需要对其具有所有权,所以我们下面介绍hive的外部表,我们默认创建的就是内部表,我们上一个博客已经写得很清楚了
二、外部表
如果我们正在分析来自股票市场的数据,我们会定期从某个的数据源接入数据,我们假设数据在分布式系统的/user/had/data/下数据已冒号分隔我们应该这要创建
create external table datas( //关键字告诉我们自身应该外部表
exchange string,
symbol string,
ymd string,
price_open float,
price_high float,
price_low float,
pirce_close float,
volume int,
price_adj_close float)
row format delimited
fields terminated by ","
location "/user/had/data"; //location代表表的数据存储位置
我们一般判断一个表是不是外部表的方式: 1,查看我们hive的元数据的tabs表的元数据可以看到 2,在hive命令行输入 show external 表名;
三、管理表和外部表的区别
1,有些hiveQL语法结构并不适用于外部表
2,对于管理表别的用户也知道在哪个路径下,因此用户也可以使用其他工具(列如:hadoop的hdfs命令)等来修改管理表所在的路径目录下的数据的,而外部表则是可以指定存放的数据
3,hive的管理表实际上对于所存储的文件的完整性以及数据内容是否和表模式一样并没有支配能力,甚至管理表都没给用户提供这些管理能力,这样他共享数据的能力极差,所有这时候我们就可以使用外部表
4,还有一个最大的区别,内部表一旦删除数据也会跟着删除,而外部表则不同,用户不能改变数据,只能改变表结构
四、基础补充
1,文本文件数据编码
分隔符 描述
\n 对于文本文件来说,每行都是记录,因此换行符可以分隔记录
^A 用于分隔字段(列) create table 语句中可以使用八进制\001表示
^B 用于分隔array或者struct中的元素 create table 语句可以使用八进制\002表示
^C 用于分隔map中的键和值,在create table中可以使用八进制\003表示
2,导出数据
1)如果数据文件恰好是用户需要的格式,那么只需要简单的拷贝文件夹或者文件就可以了
hadoop fs -cp source_path target_path
2)否则用户可以使用insert .... directory ...
insert overwrite local directory "/user/had/data"
select name,age,sex from students where age not in(16);
overwrite :覆盖当前路径下的全部数据
local: 数据指定在本机上的某个路径
在hive的0.13版本以后有一个新的特性:
skip.header.line.count 和 skip.footer.line.count
这样就可以跳过页眉和页脚的指定行数 使用示例:
CREATE EXTERNAL TABLE table(columna string)
ROW FORMAT
DELIMITED FIELDS TERMINATED BY ‘\n’
LINES TERMINATED BY ‘\n’
location ‘/user/data/test/’
tblproperties (″skip.header.line.count″=″1″, ″skip.footer.line.count″=″1″);