一、Hive内部表和外部表概念?区别?最适合的应用场景?
首先弄清楚什么是元数据和表数据:元数据就是表的属性数据,表的名字,列信息,分区等标的属性信息,它是存放在RMDBS传统数据库中的(如,mysql)。表数据就是表中成千上万条数据了。
hive的存储过程:启动hive时,会初始化hive,这时会在mysql中生成大约36张表(后续随着业务的复杂会增加),然后创建表,会在mysql中存放这个表的信息(不是以表的形式存在的,而是把表的属性以数据的形式放在mysql中,这样在hive中使用sql命令一样是能够查到这张表的)。然后把本地的文本文件使用hive命令格式化导入到表中,这样这些数据就存放到hdfs中,而不是在mysql或hive中。
因此:Hive内部表和外部表概念?区别?最适合的应用场景? 表结构都是由hive控制的,但是数据的控制权和删除表产生的结果不同: 数据控制权:内部表由hive控制数据,存储在对应数据库(MySQL等)文件夹下的子文件夹;外部表保存在hdfs,hbase等指定位置的路径 删除表产生的结果:内部表删除表结构和表数据;外部表只删除表结构,数据不会被删掉,并且如果重建了表结构,数据依然在表里。
二、Hive分区表的作用?静态分区和动态分区的区别
建表方式一致 1、作用:hive分区是将数据分在不同的文件夹,在查询时通过where子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多,避免了遍历全表 区别:分区和模式不同,载入数据方式不同
2、静态分区:
- 动态分区模式:默认的是动态分区关闭,且模式严格
- 载入数据方式:通过load方式一次一个分区装载数据
????????创建分区:alter table 表名 add partition(字段名=’…’ …); ????????加载数据:load data [local] inpath ‘…’ [overwrite] into table 表名 partition(字段名=’…’ …) 3、动态分区:
- 动态分区模式:需要手动开启动态分区且设置模式为非严格
set hive.exec.dynamic.partition=true;
set hive.execdynamic.partition.mode=nonstrict;
- 载入数据方式:
通过二级转化方式(查询的结果集)一次性添加多个分区数据
create table 表名 ...
load ... into table
insert into table 分区名 partition(分区名 ...) select ... from 表名;
insert into dynamic_people partition(year,month)
select id,name,age,start_date,year(start_date),month(start_date) from people;
三、分桶抽样是怎么做的
????????分桶对应于HDFS中的文件,更高的查询处理效率,使抽样(sampling)更高效。一般根据"桶列"的哈希函数将数据进行分桶
????????建表时hive自动根据bucket数量分桶:set hive.enforce.bucketing = true;并在 create 后row format前增加:clustered by (TANLE_NAME) into N buckets 注意事项:必须使用INSERT方式加载数据
????????select? *? from 表名 tablesample(bucket X out of Y on id) s;其中x为第几个部分,Y为分桶数量的整数倍或因子。如果Y为分桶数,则数据为第X个桶;如果Y为小于分桶数的因子,则数据为X+[n]Y的数据;如果Y为大于分桶数的倍数,则可以理解为重新分桶为Y,数据为Y中的第X个桶。
|