hive语法尝试及结论

这篇博客总结了Hive的使用经验,包括多插入模式的限制、查询不显示列头、数据覆盖、表结构复制、不同版本的查询支持如in、having操作,以及exists和嵌套查询等。还提到了数据分隔符、日期格式、数据加载时的注意事项,以及内外部表的管理。最后指出在处理字符串和分区时应注意的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

特别注意:要谨慎使用overwrite关键字,特别是它与目录结合的时候,路径不要搞错了,否则目录下的文件直接被覆盖了
hive> insert into area_t values('1','1','1',now(),'1','1',2,2);
NoViableAltException(26@[])
结论:不支持此种用法

hive> insert into table area_t select areacode,areaname,'1',gxrq,parentcode,bz,flags,flags1 from area limit 15;
结论:追加方式

hive> insert overwrite table area_t select areacode,areaname,'1',gxrq,parentcode,bz,flags,flags1 from area limit 15;
结论:覆盖的方式

hive> insert overwrite directory '/user/lifeng' select * from area;
结论:不能用into、目录要用引号包含

hive> from area
    > insert into table area_t select areacode,areaname,'1',gxrq,parentcode,bz,flags,flags1 limit 10;
结论:基本模式的用法

hive> from area
    > insert into table area_t select areacode,areaname,'1',gxrq,parentcode,bz,flags,flags1 limit 10
    > insert into table area_t select areacode,areaname,'1',gxrq,parentcode,bz,flags,flags1 order by areacode desc limit  15;
FAILED: SemanticException [Error 10087]: The same output cannot be present multiple times:  area_t

结论:使用多插入模式时,不能插入相同的表


所有查询都不会显示列头(即字段名)

hive> select [all] parentcode from area limit 20;

结论:查询所有记录

hive> select all parentcode from area order by parentcode limit 20;
结论:排序后再选取前面的20条记录,order by 全局排序,只有一个Reduce任务

hive> select all parentcode from area sort by parentcode limit 20;
结论:sort by会起两个job进行处理,花费的时间更久,只在本机做排序

hive> select distinct parentcode from area order by parentcode limit 20;
结论:排序后、去重后选择前面的20条记录

hive> select yxaccno from area a,area_t b where a.areacode = b.yxaccno;
结论:无结果产生,不能用此等值连接方式

hive> select b.yxaccno from area a right join area_t b on a.areacode = b.yxaccno;
结论:列出area_t的所有数据

hive> select a.areacode,b.yxaccno from area_t b left join area a on a.areacode = b.yxaccno;
结论:列出area_t的所有数据

hive> select a.areacode,b.yxaccno from area_t b inner join area a on a.areacode = b.yxaccno;
结论:无结果产生,不能用此等值连接方式

hive> select a.areacode,b.yxaccno from area_t b full join area a on a.areacode = b.yxaccno;
结论:列出area和area_t中的所有数据

hive> select a.areacode,b.yxaccno from area_t b join area a on a.areacode = b.yxaccno;
结论:无结果产生,不能用此等值连接方式

hive> select parentcode,count(1),sum(sons) from area group by parentcode;
结论:产生统计信息

hive> show functions;
结论:产生所有系统函数

hive> describe function substr;
结论:显示系统函数的具体用法

hive> show databases;
结论:显示所有的数据库

hive> use dw_testing;
结论:使用dw_testing库

hive> show tables;
结论:显示该库下的所有的表

hive> show tables '*t';
结论:显示以't'结尾的表。'_'这个不能任意匹配单个字符,只能代表它本身

hive> desc area_t;
结论:查看表结构

hive> alter table area_t add columns(create_time date comment '创建时间');
结论:添加字段并注释

hive> alter table area_t rename to area_new;
结论:表重命名

hive> select areacode from area where gxrq > '0' limit 2;
hive> select areacode from area where gxrq is not null limit 2;
hive> select areacode from area where gxrq = '2008/9/23 14:10:09' limit 2;
结论:对于时间的比较上不能使用上面的两种方式

hive> select areacode from area where areacode = '7777580' limit 2;
结论:也查不出数据,要去空格才可以查询到结果:select areacode from area where trim(areacode) = '7777580' limit 2;


hive> insert into table area_t select '1','1','1','2014-09-17','2','2',3,3,'2014-09-16' from area limit 1;
hive> select * from area_t;
结论:日期类型的数据以字符串的格式插入是可以的,自动调用cast进行转换

hive> alter table area_t replace columns(create_time date);
结论:
1.删除表中的除了create_time的字段。一定需要字段名+字段类型,否则会报错
2.hdfs中文件内容并没有删除,只是删除了元数据而已

hive> dfs -cat /hive/warehouse/dw_testing.db/area_t/*;
结论:查看文件内容

hive> alter table area_t change create_time update_time date;
结论:修改字段名

hive> alter table area_t add columns(name varchar(30),age int);
结论:添加多个字段

hive> alter table area_t change id cid int first;
结论:将id改名为cid并放在首列

hive> alter table area_t change username name varchar(30) after cid;
结论:将username改名为name后并紧随cid列排放。一定要更改字段的相关信息才能搭配迁移位置

hive> DESCRIBE EXTENDED area;
结论:查看外部表字段名及元数据信息,内部表值显示字段名信息

hive> desc area_t;
结论:不管内部还是外部表都显示其表结构信息(字段名、类型、长度、注释)

hive> drop table area_t;
结论:内部表会删除元数据和数据文件;外部表只会删除元数据但不删除数据文件

create table AREA_T
(
  yxaccno   VARCHAR(20),
  yxaccname VARCHAR(100),
  dbckm     CHAR(1),
  gxrq      DATE,
  yhid      VARCHAR(10),
  bz        VARCHAR(200),
  areatb    int,
  levels    int
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ESCAPED BY '\\' STORED AS TEXTFILE;
结论:建表时一定要加上分隔符

hive> load data local inpath '/usr/local/wonhigh/hivearea_t_file.txt' into table area_t;
结论:将本地数据追加进内部表

hive> load data local inpath '/usr/local/wonhigh/hivearea_t_file.txt' overwrite into table area_t;

结论:将本地数据覆盖所有内部表的数据

hive> create table area_t_cp like area_t;
结论:内部表的表结构复制
hive> create table area_cp like area;
结论:外部表的表结构复制

hive> select colthno,count(*) from mid  where trim(colthno) in('BYW34U09DJ1BM4','BYW35G03DU1BM4','BYW35N32DP1BL4','BYW35N32DU1BL4') group by colthno having trim(colthno) = 'BYW34U09DJ1BM4';

结论:0.13版本支持in、支持having操作

hive> select * from mid b where b.colthno in(select a.colthno from mid_cp a where a.price > 0 limit 10) limit 20;

结论:in中支持子查询

hive> select b.* from mid b where exists (select 1 from mid_cp a where a.colthno = b.colthno) limit 20; 

结论:支持exists

hive> select a.colthno,a.price from (select colthno,sum(round(price,2)) price from mid where trim(colthno) in('BYW34U09DJ1BM4','BYW35G03DU1BM4','BYW35N32DP1BL4','BYW35N32DU1BL4') group by colthno having colthno <> 'BYW34U09DJ1BM4') a order by a.colthno;

结论:支持嵌套查询

hive> drop database dc_retail_mdm cascade;

结论:当dc_retail_mdm中拥有表时,需要加上cascade才能删除


小结:

1.在创建表时一定要加上数据分隔符

2.平面文件中的表头不能保留表头(字段列)

3.平面文件以UTF8格式保存,防止乱码

4.对于日期的使用,date只能表示日期且在平面文件中的格式必须是yyyy-MM-dd;timestamp表示日期+时间,格式可以有两种形式:YYYY-MM-DD HH:MM:SSYYYY-MM-DD HH:MM:SS.fffffffff

5.在使用overwrite时一定要谨慎路径问题

6.平面文件分隔符尽量不要用'\t',可能字段值本身就有空格

7.load数据的时候,如果字符超过字段容忍的长度,会自动从第一位开始截取,如果类型不匹配且转换不了的就直接赋予null

8.hive中所有的查询语句在展示列表是都不会显示列头(字段名)

9.在删除表中某些字段后,hdfs上的文件没有实质上的变换

10.删除内部表时,hdfs上的文件也会随之删除

11.删除外部表时,hdfs上的文件不会被删除

12.在做外部表与文件进行关联时要先在hdfs上创建存储目录,然后上传文件,最后建表关联

13.在字符串操作时,一定得注意字符串的空格情况,不然查询不出想要的记录

14.待续(分区)

学习文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual

<think>好的,我现在需要回答用户的问题:“安装Hive之前必须先安装Hadoop吗?” 首先,我需要回顾Hive的基本架构和依赖关系。Hive是基于Hadoop构建的数据仓库工具,它使用HDFS作为存储,并依赖MapReduce、Tez或Spark作为计算引擎。因此,理论上Hive需要Hadoop环境才能运行。 不过,用户可能想知道是否存在例外情况,比如是否可以在没有完整Hadoop安装的情况下使用Hive。比如,是否可以使用其他存储系统替代HDFS,或者使用本地模式运行Hive而无需Hadoop集群。我需要查阅Hive的官方文档或可靠资料,确认这些可能性。 根据Apache Hive官方文档,Hive确实需要Hadoop的支持,因为它的元数据存储和数据处理都依赖于Hadoop组件。尤其是在生产环境中,Hive必须与Hadoop集成。但可能存在本地模式(Local Mode)的配置,允许在单机上运行而不需要启动完整的Hadoop集群,这种情况下可能只需要Hadoop库文件,而不需要Hadoop服务运行。这通常用于开发和测试,而不是生产环境。 另外,用户可能关心安装Hive的具体步骤是否需要先配置Hadoop,或者是否可以同时安装。需要明确Hive的安装流程,是否在安装过程中会检查Hadoop的存在。比如,Hive的配置文件需要指向Hadoop的安装目录,因此在安装Hive之前,Hadoop必须已经安装并配置好。 可能还需要提到Hive的不同版本对Hadoop版本的兼容性要求,比如某些Hive版本可能需要特定版本的Hadoop。这也是安装前需要考虑的因素。 总结:虽然Hive设计上依赖Hadoop,但可能存在本地模式的特殊情况,不过通常来说,安装Hive前必须先安装并配置好Hadoop。需要明确说明这一点,并解释原因,同时提到可能的例外情况及其适用场景。</think>--- ### **安装 Hive 前必须安装 Hadoop 吗?** 是的,**安装 Hive 前必须安装 Hadoop**,但需根据具体使用场景区分以下两种情况: --- #### **一、生产环境:必须依赖 Hadoop** 1. **核心依赖关系** - **HDFS**:Hive 默认将数据存储在 HDFS(Hadoop 分布式文件系统)中,表数据文件实际保存在 HDFS 路径下。 - **计算引擎**:Hive 的查询任务需要通过 MapReduce、Tez 或 Spark 执行,而这些引擎依赖 Hadoop 集群的资源调度(YARN)和分布式计算能力。 - **元数据存储**:Hive 的元数据(如表名、列类型)通常存储在外部数据库(如 MySQL),但数据本身的读写和计算离不开 Hadoop。 2. **典型安装流程** ```plaintext 安装 JDK → 安装 Hadoop → 配置 Hadoop 集群 → 安装 Hive → 配置 Hive 连接 Hadoop ``` --- #### **二、本地测试模式(无需 Hadoop 集群)** 1. **适用场景** - 仅用于学习或简单测试,无需处理大规模数据。 - 支持在单机环境下运行,但功能受限。 2. **限制条件** - **依赖 Hadoop 库文件**:即使不启动 Hadoop 集群,Hive 仍需调用 Hadoop 的 JAR 包(如 `hadoop-common.jar`)来解析 HDFS 路径和本地文件系统操作。 - **数据存储本地化**:数据可保存在本地文件系统(而非 HDFS),但无法使用分布式计算能力,性能极低。 - **不支持完整功能**:分区、分桶等依赖分布式存储的特性可能无法正常使用。 3. **本地模式安装示例** - 安装 Hadoop 库文件(无需启动集群): ```bash # 从 Apache Hadoop 官网下载二进制包并解压 tar -xzf hadoop-3.x.x.tar.gz # 设置环境变量 export HADOOP_HOME=/path/to/hadoop-3.x.x ``` - 安装 Hive 并配置使用本地模式: ```bash # 从 Apache Hive 官网下载二进制包并解压 tar -xzf apache-hive-3.x.x-bin.tar.gz # 设置环境变量 export HIVE_HOME=/path/to/apache-hive-3.x.x-bin ``` --- #### **三、特殊情况:使用其他存储系统** - **替代 HDFS 的存储系统**(如 Amazon S3、阿里云 OSS) 若 Hadoop 配置为对接云存储(需启用 `hadoop-aws` 等模块),Hive 可直接读写云存储数据,但底层仍需依赖 Hadoop 的兼容性接口。 **注意**:这仍属于 Hadoop 生态的扩展使用,并非完全脱离 Hadoop。 --- #### **四、总结** | **场景** | **是否需安装 Hadoop** | **说明** | |-------------------|-----------------------|---------------------------------------| | 生产环境 | ✅ 必须 | 依赖 HDFS、YARN、计算引擎等核心组件 | | 本地测试模式 | ✅ 需 Hadoop 库文件 | 无需启动集群,但需 JAR 包支持 | | 替代存储(如 S3) | ✅ 需 Hadoop 配置 | 依赖 Hadoop 的存储接口实现 | **结论**: - **Hive 的设计初衷是作为 Hadoop 生态的查询工具**,因此安装前必须确保 Hadoop 环境可用(生产环境需完整集群,本地模式需库文件)。 - 若仅想体验 Hive 的 SQL 语法,可尝试 **Docker 快速部署** 或 **云托管服务**(如 Amazon EMR),避免手动安装 Hadoop
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值