正常使用create关键字创建的表都是管理表 table_type都是 MANAGED_TABLE
内部表的特性是将内部表的数据移动到对应{hive.metastore.warehouse.dir}的DataNode上
在删除内部表是会在删除元数据的同时删除数据
外部表创建的关键字是external
由local标识数据存储的位置,在drop表的时候外部表的删除的时候只会删除元数据而不会删除原始数据
在进行表结构的复制的时候如果原数表是外部表那么新生成的依然是外部表,及时是没有external关键字标识也是一样
静态分区
分区的关键字是partitioned by
创建分区之后 在hdfs上回创建分区目录的子目录,而不是常规的单表名目录
分区字段一旦创建好会和普通的字段没有什么差别
分区能够更快的查询,当查询某一个国家时只需要扫描一个分区列就可以。
默认情况下未经包含所有分区查询的查询语句是不允许提交因为这样会触发非常大的MapReduce任务这样的模式成为严格模式可以通过设置属性:set hive.exec.dynamic.partition.mode=nonstrict;
hive>load data local inpath '/home/hyxy/logs.txt' into table hive.logs partition (dt='2018-08-08',country='changchun');
hive>load data local inpath '/home/hyxy/logs1.txt' into table hive.logs partition (dt='2018-08-08',country='haerbin');
hive>select * from hive.logs;
OK
1231 dflksajflkshfdlksdf 2018-08-08 changchun
123132 asjflkafjlkajflkaf 2018-08-08 changchun
12131 jkldjflksfdlksfddsf 2018-08-08 changchun
12 ccc 2018-08-08 haerbin
32 aaa 2018-08-08 haerbin
31 ffff 2018-08-08 haerbin
但是静态分区的分区列需要手动设置非常的不方便
动态分区
hive> create table stocks_partitions(exchange1 string,symbol string,ymd string,price_open float,price_high float,price_low float,price_close float,volume int,price_adj_close float) partitioned by (year string,month string) row format delimited fields terminated by ',';
创建一张股票数据表 分区通过年份和月份 通过‘,’切分
insert overwrite table stocks_partitions partition(year,month)
select exchange1,symbol,ymd,price_open,price_high,price_low,price_close,volume,price_adj_close,substr(ymd,0,4)
as year,substr(ymd,6,2) as month from stocks;
插入语句主要分为分为两部分 值得注意的是insert 后面接的是overwrite 是覆盖而不是into 后面再接表明和分区 这里的关键字是partition而不是定义时用的partitioned
此时算得上是声明部分 主要声明的是 插入的类型 被插入的表 以及分区字段
第二部分为从原始表中选择的字段 以及上面声明的分区键的截取范围
大体的框架为 从那张表选择哪些字段插入覆写到新表中 并选取那个字段的 那个范围 作为声明的分区