1,内部表:当删除内部表时,HDFS上的数据以及元数据都会被删除 2,外部表:但删除外部表时,HDFS上的源数据不会被删除但元数据会被删除 3,临时表:在当前会话期间存在,会话结束时自动消失。 4,分区表:将一批数据按照一定的字段或关键字分为多个目录进行存储 5,分桶表:将一批数据按照指定好的字段和桶的数量,对指定字段的数据取模运算,分成不同的桶进行存储,方便随机取样以及join等操作。
创建语句
CREATE TABLE gfstbl( id INT, name STRING, age INT, gfs ARRAY<STRING>, address MAP<STRING,STRING>, info STRUCT<country:String,province:String,shi:String> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' COLLECTION ITEMS TERMINATED BY ',' MAP KEYS TERMINATED BY ':' LINES TERMINATED BY '\n' LOCATION "/test";//可以设置源数据的位置,若不设置默认就在Hive的工作目录区ROW FORMAT是设置行的格式,方便通过load加载数据
加载数据
load data local inpath '/root/gfs.txt' into table gfstbl;查看表详细信息
DESCRIBE [EXTENDED|FORMATTED] table_name EXTENDED极简的方式显示 FORMATTED格式化方式来显示 DESCRIBE EXTENDED gfstbl;默认就是EXTENDED DESCRIBE FORMATTED gfstbl;创建表方式二
create table gfstbl1 like gfstbl;只是创建表结构创建表方式三
create table gfstbl2 AS SELECT id,name,gfs,address from gfstbl; 会创建相应的表结构,并且插入数据(1)insert 指定分区 (2)load data 指定分区 (3)查询已有表的数据,insert到新表中
from day_hour_table insert into table newt partition(dt=01,hour=9898) select id,content(4)alter table add partition创建空分区,然后使用HDFS命令往空分区目录中上传数据 (5)创建分区,并且指定分区数据的位置
文件1 文件2 举例:找到相同的URL
分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储 由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中 对于hive中每一个表、分区都可以进一步进行分桶
应用场景:随机、join
样例数据: 1,tom,11,189 2,cat,22,189 3,dog,33,189 4,hive,44,189 5,hbase,55,189 6,mr,66,188 7,alice,77,188 8,scala,88,188
原始表: CREATE TABLE original( id INT, name STRING, age INT,height DOUBLE) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; 加载数据至原始表中: LOAD DATA LOCAL INPATH "/root/bucketData" into table original; 分桶表: CREATE TABLE psnbucket( id INT, name STRING, age INT) CLUSTERED BY (age) INTO 4 BUCKETS ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; 插入数据: insert into table psnbucket select id, name, age from original; 每一个小文件对应一个桶 抽样: select * from psnbucket tablesample(bucket 1 out of 4 on age); 分桶表+分区表: CREATE TABLE psnbucket_partition( id INT, name STRING, age INT) PARTITIONED BY(height DOUBLE) CLUSTERED BY (age) INTO 4 BUCKETS ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; 插入数据: insert into table psnbucket_partition partition(height) select id, name, age,height from original; 多个分区中的对应的位置的小文件组成一个桶 抽样: select * from psnbucket tablesample(bucket 1 out of 4 on age);