暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

原创 | 大数据入门基础系列之详谈Hive的外部表(包含常用操作)

大数据躺过的坑 2017-12-11
737





点击上方 "大数据躺过的坑" 关注我们




在前面的博文里,我已经介绍了

大数据躺过的坑之2017年9月份所有微信公众号干货汇总

大数据躺过的坑之2017年10月份所有微信公众号干货汇总

大数据躺过的坑之2017年11月份所有微信公众号干货汇总

【夜读】你这个病,叫做误把熬夜当拼命

原创 | 大数据入门基础系列之浅谈Hive的特点

【夜读】所谓人生开挂,不过是厚积薄发

原创 | 大数据入门基础系列之浅谈Hive的优缺点

【夜读】唯有不断充实自己,增强自己的核心竞争力,把今天的自己活成人生中最好的自己,你才有机会超越年龄带给你的局限。

原创 |  大数据入门基础系列之浅谈Hive和数据库的差别

【夜读】把行动交给现在,把结果交给时间

原创 | 大数据入门基础系列之详谈Hive的文件存储格式(TextFile、SequenceFile、RcFile、自定义格式)

【夜读】跌倒不要紧,要紧的是赶快爬起来

原创 | 大数据入门基础系列之浅谈Hive的工作原理

【夜读】30岁了,20岁的借口不能用了

原创 | 大数据入门基础系列之Hive 的基本数据类型、复杂数据类型、数据类型之间转换

【夜读】没有谁天生一副铠甲,但你可以让自己无坚不摧

原创 | 大数据入门基础系列之浅谈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外部表的创建

        创建外部表使用 EXTERNAL 关键字。IF NOT EXISTS 表示如果 table2 表不存在就创建,存在就不创建。例如

 Hive> CREATE EXTERNAL TABLE IF NOT EXISTS table2(id INT COMMENT 'comment1',name STRING COMMENT 'comment2',no INT COMMENT 'comment3');


   或者

         create external table et (name string , age string);  

此时,会在hdfs的/user/hive/warehouse/下面新建一个表目录et

          load data inpath '/input/edata' into table et;  


        此时会把hdfs上/input/edata/下的数据转到(注意我的用词)/user/hive/warehouse/et下,删除这个外部表后,/user/hive/warehouse/et下的数据不会删除,但是/input/edata/下的数据在上一步load后已经没有了!数据的位置发生了变化!本质是load一个hdfs上的数据时会转移数据!


        创建外部表,需要在创建表的时候加上external关键字,同时指定外部表存放数据的路径(当然,你也可以不指定外部表的存放路径,这样Hive将 在HDFS上的/user/hive/warehouse/文件夹下以外部表的表名创建一个文件夹,并将属于这个表的数据存放在这里)



或者

hive> create external table exter_table(
    > id int,
    > name string,
    > age int,
    > tel string)
    > location '/home/hadoop/external';
OK
Time taken: 0.098 seconds








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 exter_table;

       数据不是移动到外部表的/user/hive/warehouse/exter_table文件夹中(除非你创建表的时候没有指定数据的存放路径)!大家 可以去HDFS上看看!对于外部表,数据是被移动到创建表时指定的目录(本例是存放在/home/hadoop/external文件夹中)!







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外部表的删除

如果你要删除外部表:

        drop table exter_table;

hive> drop table exter_table;
OK
Time taken: 0.093 seconds











同时,大可以关注我的个人博客

   http://www.cnblogs.com/zlslch/   和  http://www.cnblogs.com/lchzls/ 



       以及对应本平台的QQ群:161156071(大数据躺过的坑)








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

看完本文有收获?请转发分享给更多人

关注「大数据躺过的坑」,提升大神技能






觉得不错,请点赞和留言↓

文章转载自大数据躺过的坑,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论