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 '
'
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 '	';

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)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

原文地址:https://www.cnblogs.com/guoyu1/p/12091541.html