HiveQL表的基本概念

1 管理表

管理表其实就是我们最常用的表,最普通的表,创建表的SQL语句与MySQL一致

CREATE TABLE IF NOT EXISTS manage_table(
  id STRING,
  name STRING
)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '|'
STORED AS TEXTFILE;

通常会使用IF NOT EXISTS来防止因表存在而创建失败报错的情况,这里设置字段之间的分割采用|的方式
创建管理表
通常情况下表里的数据存放在/user/hive/warehouse/DatabaseName.db目录下,DatabaseName表示当前你所在的database,而/user/hive/warehouse/这个目录是在hive-core.xml中的hive.metastore.warehouse.dir下设置的,设置的值默认为Hive数据存放地址。
创建管理表所在位置
当然你也可以自己指定这个表数据存放地址,不使用默认存放地址。

CREATE TABLE IF NOT EXISTS manage_table(
  id STRING,
  name STRING
)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '|'
STORED AS TEXTFILE
LOCATION '/study/hive/manage_table';

管理表其实就是内部表,一般数据只在Hive内部使用,我们对数据具有一定的控制权限,所以当我们对某个表执行删除命名时,会删除存放表信息的元数据以及这个表中的数据,不过如果你自己为这个表额外指定了存储位置,并不是删除这个位置下的数据,只会删除元数据。

2 外部表

外部表与管理表(内部表)的区别在于,Hive对外部表的数据不具有控制权限,当我们对外部表执行删除SQL语句的时候,只会删除存放表信息的元数据,不会删除这个表中的数据,创建一个外部表的SQL语法与内部表的语法基本一致,只需要创建的时候添加EXTERNAL关键字标识这是一个外部表即可。

CREATE EXTERNAL TABLE IF NOT EXISTS external_table(
  id STRING,
  name STRING
)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '|'
STORED AS TEXTFILE
LOCATION '/study/hive/external_table';

创建外部表
如果我们不指定LOCATION的话,外部表也会使用默认的存储地址。
管理表和外部表基本一样,不过我们可以通过查看表的具体信息查看这张表属于哪种表

DESCRIBE EXTENDED tableName;

查看表详细信息
使用上面命令可查看表的详细信息,location字段的值存储的是表存放位置,tableType表明这是一张管理表还是外部表。

其实有时候管理表与外部表区别并不是很大,这是因为就算是管理表里的数据,我们也可以对表所在的位置进行访问,可以不通过Hive去访问,通过Hadoop去访问也是一样的。

3 分区表

分区表的创建只是为了防止数据量比较大的时候不利于查询,于是根据表里的某些字段进行分区,可使得查询速度更快一点,创建分区表的方式与创建管理表也是一致的,只需要使用PARTITIONED BY申明是使用哪些分区进行分区即可

CREATE TABLE IF NOT EXISTS partition_table(
  id STRING,
  name STRING
)
PARTITIONED BY (year INT,month INT,day INT)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '|'
STORED AS TEXTFILE;

创建分区表
分区表中的数据存储方式其实就是为每个分区字段在表下创建一个目录,目录的名称采用的规则是分区字段名=分区值的方式。
分区表中的数据存储
当我们在使用查询的时候就可以使用分区值进行查询。

SELECT * FROM partition_table WHERE year=2018 AND month=5 AND day=1;
SELECT * FROM partition_table WHERE year=2018 AND month=5;

使用分区值对分区表进行查询
前两个值分别表示idname,后面的值就是分区值,其实分区表里的数据就没有必要为分区字段存储值,该值已经存储在目录中,只需要声明其为分区字段就会自动显示出来。

由于Hive是基于MapReduce的,如果你不对表进行分区,当你对一张数据量非常大的表进行查询时会触发一个巨大的MapReduce任务,所以一般希望所有的表查询进行分区过滤,我们可以设置hive.mapred.mode=strict来限制查询必须使用分区进行过滤,设置hive.mapred.mode=nonstrict解除该限制。

set hive.mapred.mode=strict;
set hive.mapred.mode=nonstrict; 

设置按分区过滤
查看分区表信息,可以查看prtitionKeys的值可以查看分区字段是哪些。
查看分区表详细信息
我们也可以直接查询一张表的所有分区

SHOW PARTITIONS partition_table;
SHOW PARTITIONS partition_table PARTITION(year=2018);

查看分区表分区信息
我们也可以直接为分区表直接增加一个分区,也可以为这个分区指定这个分区存放的地址

ALTER TABLE partition_table ADD PARTITION(year=2018,month=5,day=3);
ALTER TABLE partition_table ADD PARTITION(year=2018,month=5,day=4)
LOCATION '/study/hive/partition_table/2018/5/4';

增加分区
修改分区存储路径

ALTER TABLE partition_table PARTITION(year=2018,month=5,day=3)
SET LOCATION '/study/hive/partition_table/2018/5/3';

这个修改存储路径不是转存,而是类似于将这个分区存放位置指向另一个位置
修改分区存储路径
删除分区

ALTER TABLE partition_table DROP IF EXISTS PARTITION(year=2018,month=5,day=4);

这个删除分区会将元数据和分区下的所有数据,如果是外部表或者路径不在默认路径下,则不会删除分区下的所有数据。
删除分区

4 外部分区表

外部分区表与分区表基本上具有一样的操作,创建的时候也是只需要创建的时候添加EXTERNAL关键字标识这是一个外部分区表即可

CREATE EXTERNAL TABLE IF NOT EXISTS partition_table(
  id STRING,
  name STRING
)
PARTITIONED BY (year INT,month INT,day INT)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '|'
STORED AS TEXTFILE;
<think>好的,我现在要处理用户关于Hive数据仓库基本概念的查询。首先,我需要回顾用户提供的引用内容,确保回答准确。 用户引用了四个来源,其中引用[1]提到Hive是基于Hadoop的开源分布式数据仓库,用于处理结构化数据。引用[2]强调Hive将结构化文件映射为,支持类SQL查询。引用[3]涉及版本和环境配置,可能对基本概念帮助不大,但需注意Hive与Hadoop的关联。引用[4]区分操作型数据库和数据仓库,指出数据仓库按主题组织数据,这对解释Hive的设计理念很重要。 用户的问题聚焦于基本概念,所以需要涵盖定义、核心功能、架构组成、数据模型和特点。需要将引用中的关键点整合进去,比如HiveSQL接口、HDFS存储、主题域组织等。同时,要确保使用正确的中文术语和LaTeX格式,比如技术术语如HDFS、ETL等可能需要用$符号包裹。 接下来,结构要清晰,分点回答。每个部分需简明扼要,例如定义部分直接说明Hive是什么,核心功能部分介绍SQL映射和计算引擎。架构部分需要提到元数据存储、驱动程序和Hadoop组件。数据模型要解释数据库、、分区等概念。最后,特点部分强调易用性、扩展性和适用场景。 还要生成相关问题,考虑用户可能的后续需求,比如架构深入、与传统数据库对比、应用场景等。确保问题与基本概念相关,帮助用户进一步学习。 需要检查LaTeX是否正确,比如技术词汇是否用$包裹,独立公式是否用$$,但根据用户问题,可能数学公式不多,但变量如HDFS、ETL等可能需要处理。例如,HDFS应写成$HDFS$,ETL写成$ETL$,确保符合格式要求。 最后,确保引用标识正确添加到对应的内容末尾,例如提到数据仓库主题时引用[^4],Hive定义时引用[^1][^2]。避免遗漏引用来源,同时保持语句流畅,引用标识自然放置。 现在组织内容,确保每个部分引用正确,语言简洁,符合用户要求的格式和结构。</think>### Hive数据仓库基本概念解析 #### 一、定义与定位 Hive是基于$Hadoop$生态的开源**分布式数据仓库工具**,主要用于处理存储在$HDFS$(Hadoop分布式文件系统)中的结构化数据。其核心功能是将数据文件映射为类似关系型数据库的结构,并提供类$SQL$(HiveQL)的查询能力[^1][^2]。 #### 二、核心组成与架构 1. **元数据存储** Hive通过$Metastore$(元数据存储)管理结构、字段类型等信息,默认使用嵌入式$Derby$数据库,但生产环境通常配置$MySQL$等外部数据库[^3]。 2. **计算引擎** 依赖$MapReduce$、$Tez$或$Spark$执行底层计算,用户无需编写复杂代码,通过$SQL$即可完成数据分析。 3. **数据存储** 数据实际存储在$HDFS$中,支持多种文件格式(如$ORC$、$Parquet$),通过分区($Partition$)和分桶($Bucket$)优化查询性能。 #### 三、数据模型特性 1. **主题域组织** 数据按业务主题(如用户行为、商品交易)而非事务流程组织,例如电商场景会围绕“商品推荐”构建主题域[^4]。 2. **层级结构** 包含数据库($Database$)→($Table$)→分区($Partition$)→分桶($Bucket$)四级结构,支持数据隔离和高效查询。 #### 四、核心特点 1. **易用性** 通过$SQL$语法降低大数据处理门槛,例如: ```sql SELECT user_id, COUNT(*) FROM orders GROUP BY user_id; ``` 2. **扩展性** 可横向扩展至数千节点,处理$PB$级数据。 3. **批处理导向** 适合离线分析场景,延迟通常在分钟级,与实时计算框架(如$Flink$)形成互补。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值