文章目录
持续更新…
托管表(Managed Tables) 与 外部表(External Tables)的区别
这里主要解释两种表中的区别
元数据与实际数据
据笔者的理解,Hive 的数据表应该是包含两种数据元数据与实际数据;
元数据指的是 Hive 储存的用于维护其数据表的数据,例如:
- 数据表的物理地址
- 数据表的额外属性(由
DBPROPERTIES
指定) - 数据表的备注
- 数据表的其他非实际储存字段
实际数据指的是 Hive 的数据表中实际储存的数据,如字段 A 中的第一行到第一百行的数据
托管表
托管表指的是 Hive 会去管理(指增删改)该表的数据,包括实际数据,属性与数据结构,也就是 Hive 会根据命令去修改这些数据,并且所有数据都会储存于在可见的文件系统中,你可以随意地改动这些数据,但是会导致对应的 Hive 数据表作出不可预料的行为,托管表多用于本地数据库
外部表
外部表与托管表最大的不同是,外部表不会去管理与验证数据的来源,甚至不会去主动查验该数据表的数据完整性,当然你可以执行MSCK REPAIR TABLE table_name
来刷新数据表,Hive 只会负责管理该表的元数据,所以该表被删除DROP
的时候只会删除其元数据,其数据来源不会受到任何影响,这种表多用于引用外部数据或者导出数据
Hive 数据的导出导入
这里用于汇总解释 Hive 的数据导出导入的几种方法
导入到 Hive
- 从文件中导入到 Hive
这里指从文件系统中导入到 Hive 数据表中,一般有两种情形,本地文件系统与HDFS,这种功能可以通过命令LOAD DATA [LOCAL] INPATH <path> [OVERWRITE] INTO TABLE <table_name>
实现- 若要使用 HDFS 文件系统,请在
<path>
中使用 URI,例如hdfs://namenode:1234/hadoop/dataFileA
- 当没有指定
LOCAL
关键字时,Hive 会使用 URI 或者 且没有指定 URI 并使用的是相对路径时,Hive 将会将该地址关联到/user/${username}
上 - 当指定了
OVERWRITE
关键字时,Hive 会使用指定的数据来覆盖目标表中的数据 - 当目标表是分区表时,请在命令最后添加
[PARTITION (partcol1=val1, partcol2=val2 ...)]
来指定分区
- 若要使用 HDFS 文件系统,请在
- 从其他表导入到 Hive
- CTAS(Create Table As Select),这个方法可以从其他表中的
SELECT
语句获得的结果来建立一个新的表,同时也会也只能复制目标表的数据结构与属性,- 用法
CREATE TABLE <table_name> AS SELECT <select_clause>
- 用法
- 把其他表中的
SELECT
语句获得的结果来插入到现存的表中,但这个目标表与源数据表的表结构必须相同- 用法
INSETR INTO TABLE <table_name> SELECT <select_clause>
- 用法
- CTAS(Create Table As Select),这个方法可以从其他表中的
导出到文件系统
- 导出到本地文件系统或者到 HDFS,可以使用命令
INSERT OVERWRITE [LOCAL] DIRECTORY <path> [ROW FORMAT row_format] [STORED AS file_format] SELECT <select_clause>
- 若指定
LOCAL
关键字,可以直接使用本地相对路径或者绝对路径,但是若没有指定的话请明确指定 URI row_format
可以指定导出文件的分隔符,例如:ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
即可指定,
为分隔符
- 若指定
- 可以使用 DFS 命令来操作 HDFS 来直接导出数据表的数据