Hive建表
一、Hive建表语句
(1)创建内部表
(2)创建外部表
drop table yum_area_dw.dw_community_base_info_aoi_clean; CREATE EXTERNAL TABLE `yum_area_dw.dw_community_base_info_aoi_clean`( `id` bigint comment '小区id', `community_name` string comment '小区名称', `city_id` bigint comment '城市id') comment '表备注' PARTITIONED BY ( dt string comment '日期分区') row format delimited fields terminated by '\u0001' lines terminated by '\n' stored as textfile;
二、数据导入
1、Hive客户端中将数据导入hive表:根据数据源不同划分
(1)从本地文件系统中导入数据到hive表中:
load data local inpath "path" [OVERWRITE] into table tablename;
(2)从HDFS上导入数据到hive表中:
load data inpath "path" [OVERWRITE] into table tablename;
(3)从别的表查询出来的数据导入到hive表中:
insert overwrite table tablename_1 partition()
select .... from tablename_2 where ......
三、内部表和外部表
1、Hive内部表和外部表区别:主要分为两方面,数据加载load、删除表drop。
数据加载:创建内部表时,会将数据移动到hive指向的路径,并且由hive来管理数据的生命周期。
创建外部表时,只是记录数据所在的路径,不对数据位置做改变。
删除表:删除内部表,数据和元数据会一起删除掉。
删除外部表,只是删除元数据,数据不会删除。
四、分区和分桶
1、分区:分区是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。那其实这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找,避免全表扫描,可以提高查询效率。
注意:分区只是添加了一个伪列,这个伪劣使我们人为规定的,只在查询的时候显示,实际在表中并不存在这个列。不能按照某个数据表中真实存在的列,如userid来分区。
分区的目的就是提高查询效率,查询分区数据的方式就是指定分区名,指定分区名之后就不再全表扫描,直接从指定分区(如name=jack的分区)中查询,从hdfs的角度看就是从相应的文件系统中(如name=jack文件夹下)去查找特定的数据
create table dept_partition(deptno int , dname string,loc string)
partitioned by (month string)
row format delimited fields terminated by '\t';
2、分桶:分桶是相对分区进行更细粒度的划分。分桶将整个数据内容按照某列属性值的hash值进行区分,如要按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。
注意:分桶的列是表中已存在的列,而不是伪列。分桶的信息在hdfs上看不到相关的文件,但是可以查询到分桶中的数据,说明确实分桶了。
create table test_bucket (
id int comment 'ID',
name string comment '名字'
)
comment '测试分桶'
clustered by(id) into 4 buckets
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
3、分区和分桶的区别:
(1)分区是指定伪列进行分区,分桶是表格中真实存在的列。
(2)分区信息在hdfs上显示的是分区文件夹,而分桶在hdfs上看不到,但是查询分桶数据们可以查询到。
(3)分桶是数据的更精细的划分。
4、分桶的使用场景:
(1)当使用分区进行数据划分的时候,出现有些分区数据过多,而有些分区数据过少的时候,这时候可以采用分桶,对数据进行划分。
(2)提升Join查询的效率,若两个表都在连接的字段上进行了分桶,那么在join的时候可以使用 Map 端连接 (Map-side join)高效的实现。比如Join 操作。对于Join 操作两个表有一个相同的列,如果对这两个表都进行了分桶操作。那么将保存相同列值的桶进行Join 操作就可以,可以大大减少Join 数据量。
(3)方便抽样:使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。