一、嵌套查询统计数量去重问题
描述:如果子查询中对统计的字段已经去重,外面一层就不能同时有distinct(目标统计字段)和group by操作,否则查询结果不是统计的数量而是统计的字段数据。
如:
select
- platform_id, count(distinct user_id) uv_count
from
- (
- select
- platform_id, user_id, sum(pv) pv
- where day = '20140201'
- and (
- platform_id = 12
- or platform_id = 6
- or platform_id = 11
- or platform_id = 14
- )
- and (
- select
group by platform_id
limit 10;
查询结果:
- 6 10000242
- 6 10000332
- 6 10000468
- 6 10001799
- 6 10001809
- 6 10002210
- 6 10002753
- 6 10003070
- 6 10003815
- 6 10004929
解释:该查询中里面嵌套的一层已经group by user_id所以user_id不会有重复,最外层再distinct user_id同时group by platform_id时,查询的结果就成了platform_id和user_id而不是count出来的数量,如果distinct和group by只有其中一个操作就不会有这种现象。
解决办法:将count(distinct user_id) 改为count(user_id).
二、多次嵌套查询聚合问题
描述:如果子查询嵌套的层次过多,同时查询的数据量较大,在自由分配的情况下数据会被分到多个reducers中分别计算,计算完成后不会再进行聚合,而是把每个reduce算完的结果查询出来。
如:
查询结果:
select a.userid,sum(a.pv) pv
- from(
- select c.userid,c.bookid,c.url,count(1) pv from(
- select userid,bookid,url
- from log
- where day='20140201'
- and logtype='access'
- and project='android'
- and actionname='read'
-
and (apiCode= or apiCode ='100')
-
- select userid,bookid,url
- ) c
- group by c.userid,c.bookid,c.url
- select c.userid,c.bookid,c.url,count(1) pv from(
查询结果:
- 21057243 5
- 21057243 16
- 21057243 5
- 21057243 16
- 21057243 8
查询时分配的mappers和reducers:
- number of mappers: 635; number of reducers: 6
解释:该查询的最外层已经有group by userid,按正常逻辑最后查询结果应该是一条数据,但是在查询过程中分配了6个reducers最后就把6个分别查出来,很容易导致最后统计错误。
解决方法:在查询时将reducers设为1,即set mapred.reduce.tasks=1;
相关推荐
在实际项目中,你可能需要构建一个包含Hive查询逻辑的Java类,并将其打包成jar文件,然后在Hadoop集群上运行。 7. **提交Java作业到Hadoop集群**: 如果需要在集群上运行Java程序,可以使用`Hadoop`的`hadoop jar`...
"hive相关jar包"指的是为了与Hive交互、执行Hive查询所必需的Java库文件。这些jar包包含了Hive的执行引擎、元数据存储以及SQL解析等组件。 在描述中提到的"最新3.1.1版本",意味着这些jar包对应的是Hive 3.1.1这个...
这些jar包也用于在MapReduce、Tez或Spark等计算框架上运行Hive查询。 在Hive的不同版本之间,jar包可能会有所变化,因为每个新版本可能引入了新的特性和改进,或者修复了一些已知问题。例如,一个较早版本的Hive...
本篇将重点讲解如何利用Hive对Protobuf序列化的文件进行读取,以及相关的技术细节。 首先,了解Protobuf(Protocol Buffers)。这是Google开发的一种数据序列化协议,用于结构化数据的序列化,可以看作是XML、JSON...
在描述中提到的解决方案是替换相关的jar包,具体为`hive-exec-2.1.1-cdh6.3.2.jar`和`hive-orc-2.1.1-cdh6.3.2.jar`。这两个jar包分别是Hive执行引擎和ORC文件格式处理的实现,更新它们可能是为了修复特定版本中的...
9. **Hive与MapReduce**:Hive的本质是将SQL查询转换为MapReduce作业进行执行,因此理解MapReduce的工作原理对于优化Hive查询至关重要。 10. **Hive与Spark集成**:近年来,Hive也支持与Spark的集成,利用Spark的...
Hive JDBC 1.1.0版本是这个驱动的一个特定迭代,提供了对Hive查询、数据操作和管理功能的接口。在本篇中,我们将深入探讨Hive JDBC驱动的相关知识点,以及如何在实际项目中动态加载和使用这些jar包。 首先,理解...
这包括停止 Hive 3.0 服务,升级相关组件,然后启动 Hive 4.0 服务。过程中可能会遇到依赖冲突,需要解决后再继续。 7. **测试验证**:升级完成后,进行详尽的功能测试以验证升级成功。这包括查询性能测试、新的 ...
在大数据处理领域,Hive是一个基于Hadoop的数据仓库工具,它可以将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,使得用户可以使用SQL语句来处理存储在Hadoop分布式文件系统(HDFS)上的大数据。...
本篇将详细介绍如何在DBeaver和Java应用中使用JDBC连接Hive,以及涉及到的相关Jar包。 DBeaver是一款跨平台的数据库管理工具,支持多种数据库类型,包括Hive。要连接到Hive,我们需要在DBeaver中配置合适的JDBC驱动...
hive-exec-2.1.1 是 Apache Hive 的一部分,特别是与 Hive 的执行引擎相关的组件。Apache Hive 是一个构建在 Hadoop 之上的数据仓库基础设施,它允许用户以 SQL(结构化查询语言)的形式查询和管理大型数据集。Hive ...
数据库相关操作 Hive配置单元包含一个名为 default 默认的数据库. create database [if not exists] ;---创建数据库 show databases; --显示所有数据库 drop database if exists <database name> ...
Hive-JDBC是Hive提供的一个客户端接口,允许Java应用程序通过JDBC连接到Hive服务器,执行SQL查询并获取结果。它为Hive提供了标准的数据库访问方式,使得开发者能够像操作关系型数据库一样操作Hive。 ### 2. ...
3. hbase-protocol-1.1.1.jar 和 hbase-server-1.1.1.jar:这两个是Apache HBase的相关库,HBase是一个基于Hadoop的分布式数据库,如果Hive与HBase集成,这些库可能用于在Hive查询中直接操作HBase表。 4. hadoop-...
Hive-HBase连接器允许用户在Hive中创建外部表,将这些表映射到HBase的数据表,从而可以在Hive的SQL环境中直接对HBase数据进行查询和分析。在实际操作中,用户需要将这些JAR文件放入Hive的lib目录下,这是Hive加载其...
在大数据处理领域,Hive作为一个基于Hadoop的数据仓库工具,广泛用于数据查询和分析。而DBeaver,作为一款跨平台的数据库管理工具,以其用户友好的界面和强大的功能,深受开发者喜爱。当需要在DBeaver中操作Hive...
在大数据处理领域,Hive是一款基于Hadoop的数据仓库工具,它允许用户使用SQL类的语言(称为HQL)来查询、管理、分析存储在Hadoop分布式文件系统中的大规模数据集。而DataGrip是一款由JetBrains公司开发的强大数据库...
1. Hive查询优化实践 - Owen O'Malley作为Hortonworks的创始人兼架构师,长期从事Hive开发工作,与客户密切合作,并有着Hadoop MapReduce与安全性方面的深厚经验。 - 优化Hive查询需要深入理解数据布局、数据格式...
#### 五、Hive查询 - **基本查询**:使用SELECT语句进行基本的查询操作,如: ```sql SELECT * FROM pokes WHERE year = 2012; ``` - **复杂查询**:支持多种复杂查询,如JOIN操作、分组聚合等。 #### 六、...