
在前面的博文里,我已经介绍了
【夜读】唯有不断充实自己,增强自己的核心竞争力,把今天的自己活成人生中最好的自己,你才有机会超越年龄带给你的局限。
原创 | 大数据入门基础系列之详谈Hive的文件存储格式(TextFile、SequenceFile、RcFile、自定义格式)
原创 | 大数据入门基础系列之Hive 的基本数据类型、复杂数据类型、数据类型之间转换
原创 | 大数据入门基础系列之浅谈Hive的元数据存储(单用户模式、多用户模式、远程服务器模式)
原创 | 大数据躺过的坑内部收徒201712期(目前仅面向在校学生)(少量名额)
原创 | 大数据入门基础系列之浅谈Hive的数据存储和元数据存储(多面角度来剖析)
原创 | 大数据入门基础系列之详谈Hive的外部表(包含常用操作)
Hive的外部表和内部表区别
外部表:在表结构创建以前,数据已经保存在 HDFS 中,通过创建表结构,将数据格式化到表的结果里。当进行 DROP TABLE table_name 操作的时候,Hive 仅仅删除元数据的表结构,而不删除 HDFS 上的文件,所以,相比内部表,外部表可以更放心大胆地使用。
内部表:Hive 创建并通过 LOAD DATA INPATH 进数据库的表,这种表可以理解为数据和表结构都保存在一起的数据表。当通过 DROP TABLE table_name 删除元数据中表结构的同时,表中的数据也同样会从 HDFS 中被删除。
1)创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。
2)删除表时:在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
另外需要注意的是传统数据库对表数据验证是 schema on write(写时模式),而 Hive 在load时是不检查数据是否符合schema的,hive 遵循的是 schema on read(读时模式),只有在读的时候hive才检查、解析具体的 数据字段、schema。
读时模式的优势是load data 非常迅速,因为它不需要读取数据进行解析,仅仅进行文件的复制或者移动。
写时模式的优势是提升了查询性能,因为预先解析之后可以对列建立索引,并压缩,但这样也会花费要多的加载时间。
Hive的内部表
Hive 和 Mysql 的表操作语句类似,如果熟悉 Mysql,学习Hive 的表操作就非常容易了。
Hive 的数据表分为两种,内部表和外部表。
今天给大家分享的是内部表,关于外部表在昨天已经分享完了。
Hive内部表的创建
创建内部表使用 CREATE TABLE 命令。与Mysql 创建表的命令一样,COMMENT 是对字段的注释。例如
Hive> CREATE TABLE IF NOT EXISTS table1(id INT COMMENT 'comment1',name STRING COMMENT 'comment2',no INT COMMENT 'comment3')或者
create table tt (name string , age string) location '/input/table_data';
此时,会在hdfs上新建一个tt表的数据存放地,比如,笔者是在这个path创建: hdfs://master://9000/input/table_data
Hive内部表的删除
删除表。数据表在删除的时候,内部表会连数据一起删除,而外部表只删除表结构,数据还是保留的。删除表的命令如下。
Hive> DROP TABLE table1;改变Hive外部表的结构
改表结构。例如对 table2 表添加两个字段 data_time 和 password,操作命令如下。
Hive> ALTER TABLE table2 ADD COLUMNS(data_time STRING COMMENT 'comment1',password STRING COMMENT 'comment2');
这里COMMENT是注释作用。很简单不多说。
修改Hive内部表的表名
修改表名。例如把 table2 表重命名为 table3 ,操作命令如下。
Hive> ALTER TABLE table2 RENAME TO table3;
这个命令可以让用户为表更名,数据所在的位置和分区名并不改变。换而言之,旧的表名并未“释放” ,对旧表的更改会改变新表的数据。
创建与已知表相同结构的Hive内部表
创建与已知表相同结构的表。例如创建一个与 table2 表结构相同的表,表名为
copy_table2,这里要用到 LIKE 关键字,操作命令如下。
Hive> CREATE TABLE copy_table2 LIKE table2;其实啊,如果是对旧表的复制,将旧表的结构和数据一起复制,来得到新表,则
CREATE TABLE dsjtgdk_user_copy SELECT * FROM dsjtgdk_user其实啊,如果是对旧表的复制,只将旧表的结构复制,来得到新表,则
CREATE TABLE dsjtgdk_user_copy SELECT * FROM dsjtgdk_user WHERE 1=2;dsjtgdk_user是旧表,dsjtgdk_user_copy是新表。
Hive内部表的查询
Hive 的查询语句与标准 SQL 语句类似,具体的语法如下。
SELECT [ALL | DISTINCT] select_expr,select_expr,... FROM table_reference [WHERE where_condition] [GROUP BY col_list] [ CLUSTER BY col_list|[DISTRIBUTE BY col_list] [SORT BY col_list] ] [LIMIT number]
注意:
一个 SELECT 语句可以是一个 union 查询或一个子查询的一部分; table_reference 是查询的输入,可以是一个普通表、视图、join或子查询。
往Hive内部表里加载入数据
加载本地数据使用 LOCAL 关键字,操作如下。
内部表导入数据和外部表一样:
Hive> LOAD DATA LOCAL INPATH '/home/hadoop/dsjtgdk/user.txt' INTO TABLE table2;或者 load data local inpath '/home/hadoop/data/test.txt' into table inner_table;
数据不是移动到内部表的/user/hive/warehouse/inner_table文件夹中(除非你创建表的时候没有指定数据的存放路径)!大家 可以去HDFS上看看!对于内部表,数据是被移动到创建表时指定的目录(本例是存放在/home/hadoop/inneral文件夹中)!
注意的地方就是:load data会转移数据!
Hive内部表里的内容查询
查询 table1 表的所有内容,查询语句如下:
Hive> select * from table1;OK
1 xiaoming 101
2 liuli 102
3 wuhong 103
Time taken: 0.075 seconds, Fetched: 3 row(s)
SELECT * 查询没有开启 MapReduce 任务,这是 Hive 查询语句中唯一没有把 Hive 查询语句解释为 MapReduce 任务执行。
其他的查询,由于篇幅原因,这里不多赘述。跟SQL语句差不多,不难。
Hive内部表的插入
(1)单表插入
创建一个表 insert_table,表结构和 table2 的结构相同,把 table2 表中的数据插入到新建的表 insert_table 中,代码如下。
Hive> create table insert_table like table2; 复制表结构(不包括旧表的数据)Hive> insert overwrite table insert_table select * from table2;
注意:overwrite 关键字表示如果 insert_table 表中有数据就删除。
(2) 多表插入
在table2中,查询字段 uid 并插入 test_insert1 表,查询字段 uid 并插入 test_insert2 表。操作命令如下。
Hive> create table test_insert1(num INT);
Hive> create table test_insert2(num INT);from table2 insert overwrite table test_insert1 select uid insert overwrite table test_insert2 select uid;
insert 操作的时候,from 子句既可以放在 select 子句后面,也可以放在 insert 子句前面。
注意:Hive 不支持用 insert 语句一条一条地进行插入操作,也不支持 update 操作。数据是以 load 的方式加载到建立好的表中。数据一旦导入就不可以修改。
查询Hive内部表里的数据保存到HDFS下
通过查询将Hive外部表里数据保存到 HDFS ,directory 为 HDFS 文件系统的目录。操作命令如下。
Hive> insert overwrite directory '/hive' select * from table;
注意:这里的/hive就是HDFS下的目录啦,别蒙圈。如在hdfs://master:9000/hive
查询Hive内部表里的数据保存到本地下
导入数据到本地目录,操作命令如下。
Hive> insert overwrite local directory '/home/hadoop/dsjtgdk/test' select * from table;
注意:这里的/home/hadoop/dsjtgdk/test就是在linux下的目录啦,别蒙圈。
产生的文件会覆盖指定目录中的其它文件,即将目录中已经存在的文件进行删除。
查询Hive内部表里的数据保存到多个表或多个目录下
同一个查询结果可以同时插入到多个表或者多个目录中,命令如下。
from table insert overwrite local directory '/home/hadoop/dsjtgdk/test' select * insert overwrite directory '/hive' select ip;
select * 表示把 table 表中的所有数据复制到本地 /home/hadoop/dsjtgdk/test 目录下面。
select ip 表示把 table 的 ip 字段内容复制到 HDFS 文件系统的 /hive 目录下。
注意:这里的/hive就是HDFS下的目录啦,别蒙圈。如在hdfs://master:9000/hive
Hive中管理表(内部表)和外部表的区别是什么,及分区表使用场景?
⑴ 区别:
① Hive创建内部表时(默认创建内部表),会将数据移动到数据仓库指向的路径;创建外部表(需要加关键字external),仅记录数据所在的路径,不对数据的位置做任何改变;
⑵ Hive删除表时,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据;
⑵ 场景:
① 外部表:比如某个公司的原始日志数据存放在一个目录中,多个部门对这些原始数据进行分析,那么创建外部表是明智选择,这样原始数据不会被删除;
② 内部表:对原始数据或比较重要的中间数据进行建表存储;
③ 分区表:将每个小时或每天的日志文件进行分区存储,可以针对某个特定时间段做业务分析,而不必分析扫描所有数据;
下一篇,我会详细剖析Hive的分区表里各个细分知识。
同时,大可以关注我的个人博客:
http://www.cnblogs.com/zlslch/ 和 http://www.cnblogs.com/lchzls/
以及对应本平台的QQ群:161156071(大数据躺过的坑)


本文版权归(大数据躺过的坑)作者和微信公众平台共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。 如果您认为这篇文章还不错或者有所收获,您可以通过下边的“打赏”功能 打赏我一杯咖啡【物质支持】,也可以点击右下角的【点赞】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!
看完本文有收获?请转发分享给更多人
关注「大数据躺过的坑」,提升大神技能
觉得不错,请点赞和留言↓↓↓




