Hive内部表和外部表的区别详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive内部表和外部表的区别详解相关的知识,希望对你有一定的参考价值。

参考技术A Hive内部表和外部表的区别详解 - CSDN博客

1. 内部表

create tabletest (name string , age string) location '/input/table_data';

注:hive默认创建的是内部表

此时,会在hdfs上新建一个test表的数据存放地

loaddata inpath '/input/data' into table test ;

2. 外部表

create external tableetest (name string , age string);

会在/user/hive/warehouse/新建一个表目录et

loaddata inpath '/input/edata' into tableetest;

把hdfs上/input/edata/下的数据转到/user/hive/warehouse/et下,删除这个外部表后,/user/hive/warehouse/et下的数据不会删除,但是/input/edata/下的数据在上一步load后已经没有了!数据的位置发生了变化!

本质是load一个hdfs上的数据时会转移数据!

内部表&外部表

未被external修饰的是内部表(managed table),被external修饰的为外部表(external table); 

区别: 

内部表数据由Hive自身管理,外部表数据由HDFS管理; 

内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定; 

删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除; 

对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)

Hive面试题

Hive数据倾斜

    key分布不均匀
    业务数据本身的特性
    SQL语句造成数据倾斜
解决方法
    hive设置hive.map.aggr=true和hive.groupby.skewindata=true

还有其他解决方案

Hive内部表和外部表的区别

Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。
在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。

hive的元数据和存储引擎

hive的元数据存储着通过hive所建的库和表的结构信息, 以及所对应的hdfs上的文件夹
hive可以使用mysql作为存储引擎,也可以使用其他数据库

Hive的特点以及和关系型数据库的区别

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,
可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,
不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

hive导入数据的几种方式

从本地导入: load data local inpath ‘/home/1.txt’ (overwrite)into table student;
从Hdfs导入: load data inpath ‘/user/hive/warehouse/1.txt’ (overwrite)into table student;
查询导入: create table student1 as select * from student;(也可以具体查询某项数据)
查询结果导入:insert (overwrite)into table staff select * from track_log;

 

hive导出数据的几种方式

用insert overwrite导出方式

    导出到本地:
    insert overwrite local directory ‘/home/robot/1/2’ rom format delimited fields terminated by ‘	’ select * from staff;(递归创建目录)
    导出到HDFS
    insert overwrite directory ‘/user/hive/1/2’ rom format delimited fields terminated by ‘	’ select * from staff;

Bash shell覆盖追加导出
例如:$ bin/hive -e “select * from staff;” > /home/z/backup.log
Sqoop把hive数据导出到外部

 

分区和分桶

 

hive优化

Hive中的排序关键字有哪些

sort by ,order by ,cluster by ,distribute by

    sort by :不是全局排序,其在数据进入reducer前完成排序
    order by :会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序).只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
    cluster by : 当distribute by 和sort by的字段相同时,等同于cluster by.可以看做特殊的distribute + sort
    distribute by :按照指定的字段对数据进行划分输出到不同的reduce中

 

以上是关于Hive内部表和外部表的区别详解的主要内容,如果未能解决你的问题,请参考以下文章

Hive内部表和外部表的区别

Hive中内部表和外部表之间的相互转换

2min快速了解,Hive内部表和外部表

Hive学习之三 《Hive的表的详解和应用案例详解》

hive 建表方式及参数详解

Hive面试题