外部表和内部表
内部表:
数据由hive自身管理 存储在hive指定的hdfs目录中 删除会删除数据本身
外部表(external):
数据存储在用户使用location关键字指定的hdfs目录中 hive中仅存储一份元数据 删除操作不会影响到hdfs中原本的数据文件
分区
将hdfs中文件存储在不同的目录下 hive查询时仅查询指定目录下的数据 避免扫描全部文件 可以极大的加速查询 hive支持静态分区和动态分区
静态分区由用户指定分区所在的目录 而动态分区由表中的某一个字段来决定每条数据所在的分区
外部表静态分区实例
CREATE EXTERNAL TABLE `bill`(
`id` int,
`fee` int,
`timestampe` int
)
partitioned by (day int)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
'field.delim'=',',
'serialization.format'=',')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'hdfs://header/bill/'
创建了一个bill表其中包含三个业务字段
partitioned by (day int) 指定了day为分区标志 在查询时使用 where day = 20201010 来指定分区
alter table bill add partition (day=20201010) location '/bill/20201010'
为bill表添加一个分区目录20201010 当指定day = 20201010时 将在这个分区查询数据
随日期增加 需要手动将对应日期的目录作为分区添加到bill中 可以使用crontab 每天自动执行一次添加分区的操作