MapReduce实现基本SQL操作的原理-join和group by,以及Dinstinct

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

详细讲解SQL编译为MapReduce之前,我们先来看看MapReduce框架实现SQL基本操作的原理

Join的实现原理

select u.name, o.orderid from order o join user u on o.uid = u.uid;

在map的输出value中为不同表的数据打上tag标记,在reduce阶段根据tag判断数据来源。MapReduce的过程如下(这里只是说明最基本的Join的实现,还有其他的实现方式)

 MapReduce CommonJoin的实现

Group By的实现原理

select rank, isonline, count(*) from city group by rank, isonline;

将GroupBy的字段组合为map的输出key值,利用MapReduce的排序,在reduce阶段保存LastKey区分不同的key。MapReduce的过程如下(当然这里只是说明Reduce端的非Hash聚合过程)

 MapReduce Group By的实现

Distinct的实现原理

select dealid, count(distinct uid) num from order group by dealid;

当只有一个distinct字段时,如果不考虑Map阶段的Hash GroupBy,只需要将GroupBy字段和Distinct字段组合为map输出key,利用mapreduce的排序,同时将GroupBy字段作为reduce的key,在reduce阶段保存LastKey即可完成去重

 MapReduce Distinct的实现

如果有多个distinct字段呢,如下面的SQL

select dealid, count(distinct uid), count(distinct date) from order group by dealid;

实现方式有两种:

(1)如果仍然按照上面一个distinct字段的方法,即下图这种实现方式,无法跟据uid和date分别排序,也就无法通过LastKey去重,仍然需要在reduce阶段在内存中通过Hash去重

 MapReduce Multi Distinct的实现

(2)第二种实现方式,可以对所有的distinct字段编号,每行数据生成n行数据,那么相同字段就会分别排序,这时只需要在reduce阶段记录LastKey即可去重。

这种实现方式很好的利用了MapReduce的排序,节省了reduce阶段去重的内存消耗,但是缺点是增加了shuffle的数据量。

需要注意的是,在生成reduce value时,除第一个distinct字段所在行需要保留value值,其余distinct数据行value字段均可为空。

 MapReduce Multi Distinct的实现

SQL转化为MapReduce的过程

了解了MapReduce实现SQL基本操作之后,我们来看看Hive是如何将SQL转化为MapReduce任务的,整个编译过程分为六个阶段:

  1. Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree
  2. 遍历AST Tree,抽象出查询的基本组成单元QueryBlock
  3. 遍历QueryBlock,翻译为执行操作树OperatorTree
  4. 逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量
  5. 遍历OperatorTree,翻译为MapReduce任务
  6. 物理层优化器进行MapReduce任务的变换,生成最终的执行计划

下面分别对这六个阶段进行介绍

深入剖析QWEN 2.5模型架构:从GQA到RoPE的技术实现 本文深入解析了QWEN 2.5模型架构,重点介绍了其创新的GQA(分组查询注意力)RoPE(旋转位置编码)技术实现。通过详细代码解读,展示了这些技术如何提升模型的计算效率长文本处理能力,适用于代码生成数学推理等任务。文章还提供了实践部署建议调优经验,帮助开发者更好地应用这一先进模型。 阅读详情

相关推荐

Win10环境下VS2019离线部署OnnxRuntime的完整指南

本文提供了在Windows 10系统下,为Visual Studio 2019进行OnnxRuntime离线部署的完整教程。针对网络受限环境,详细讲解了如何获取正确的离线安装包、配置本地NuGet源,并逐步指导项目配置与测试,确保AI模型在C++环境中顺利运行。

weixin_29205061的博客 369

Hive查询中的优化

hive使用group by代替distinct去重

November、Chopin 946

别再死磕Excel了!用Vensim PLE免费版,30分钟搞定你的第一个系统动力学模型

本文介绍如何使用Vensim PLE免费版在30分钟内构建第一个系统动力学模型,无需编程或数学基础。通过个人储蓄增长案例,详细讲解因果回路图绘制、存量流量图创建及方程编写,帮助读者掌握动态系统建模与仿真技巧,适用于理财、项目管理等多种场景。

weixin_29045001的博客 307

elasticsearch中如何实现dinstinct去重功能

elasticsearch中如何实现dinstinct去重功能

弹指天下 9703

SQL中的DISTINCTSQL DISTINCT详解、DISTINCT的用法、DISTINCT注意事项

DISTINCTSQL 中用来返回唯一不重复结果集的关键字。它通常用于 SELECT 语句中,可以指定一个或多个列进行去重,并返回唯一的结果。当你在使用 SELECT 查询数据时,可能会得到包含重复行的结果集。为了去除这些重复行,你可以使用 DISTINCT 关键字来获取唯一的记录。

qq_52066082的博客 7万+

Hive:简单查询不启用Mapreduce job而启用Fetch task

 一、背景:        如果在hive中仅仅查询某个表的一列,Hive也会默认启用MapReduce Job来完成这个任务。我们都知道,启用MapReduce Job是会消耗系统开销的。对于这个问题,从Hive0.10.0版本开始,对于简单的查询语句(没有函数、排序、不需要聚合的查询语句),类似SELECT <col> from <table> LIMIT n语句,当...

蓝星部队的博客 597

MapReduce实现sqlgroup byjoin

一、group byHiveQL:select deptno, sum(sal) from emp group by deptno order by deptno; 场景模拟:要求计算出每个部门的工资总额。 package com.szh.hadoop; import java.io.File; import java.io.IOException; import java.net....

天天向上 2485

【转载】MapReduce实现基本SQL操作原理-joingroup by,以及Dinstinct

转载自:http://blog.csdn.net/sn_zzy/article/details/43446027 详细讲解SQL编译为MapReduce之前,我们先来看看MapReduce框架实现SQL基本操作原理 Join实现原理 select u.name, o.orderid from order o join user u on o.uid = u.uid

weixin_37589896的博客 438

DISTINCT关键字

SQL1规定,当使用DISTINCT关键字时,字段函数的参数必须是一个简单的字段名,它不能是一个表达式。对SUM()AVG()字段函数,标准允许DINSTINCT关键字。对MIN()MAX()字段函数,标准不允许使用DINSTINCT关键字,因为它对它们的结果没有影响,但是,许多SQL实现允许它。对COUNT(*)函数,不使用DINSTINCT关键字,因为它根本不处理数据值字段。在查询中仅

minyangchina的专栏 839

一、数据库查询语句(单表查询篇)

达梦数据-数据库查询语句(单表查询篇):简单查询、带条件查询、集函数、分析函数、情况表达式、模糊查询

不知道你是通过何种途径访问到这里,总之欢迎来到red velet的博客 3182

Hive调优之MapReduce详解

MapReduce会经历作业输入(Input)、业务处理接口Map、Map到Reduce之间数据传输的环节Shuffle、业务处理接口Reduce作业输出(Output)五大环节。这5个环节还可以进一步分解成如下图: 在Hive调优的过程中,我们不希望产生太多 的Map,而把计算任务的等待时间都耗费在Map的启动上;或者不希望生成太多的Map对某个文件进行操作,以免引起资源的争用。因此需要对Map进行控制(在Hive配置“set mapred.map.tasks=task数量”无法控制Map...

qq_654603797 4566

HIVE SQL编写MR流程,以及JOINGROUP BYDISTINCT的底层执行原理

HIVE SQL编写MR流程,以及JOINGROUP BYDISTINCT的底层执行原理 内容目录HIVE SQL编写MR流程,以及JOINGROUP BYDISTINCT的底层执行原理一、编译MR流程二、HIVE SQL 转为 MR 具体原理1. JOIN2. GROUP BY3. DISTINCT 一、编译MR流程 HIVE SQL编译成MR任务是在COMPILER阶段完成的。大致可以分为6个步骤: 词法、语法解析:Antlr 定义 SQL 的语法规则,完成 SQL 词法,语法解析,将 SQL

weixin_46429290的博客 2081

MySQL中的DISTINCTGROUP BY

如果使用的是索引列,那么DISTINCTGROUP BY的性能差别不大。在MySQL中,DISTINCTGROUP BY的性能会受到多个因素的影响,包括表的大小、数据类型、查询条件等。这是因为GROUP BY需要对所有数据进行排序聚合操作,而DISTINCT只需要对不重复的数据进行处理,因此在数据量较大的情况下,DISTINCT的性能相对更优。这是因为GROUP BY需要对所有数据进行排序聚合操作,而DISTINCT只需要对不重复的数据进行处理,因此DISTINCT在没有索引的情况下相对更快。

weixin_62988359的博客 4508

hive什么时候会使用本地的mapreduce

如果在hive中运行的sql本身数据量很小,那么使用本地mr的效率要比分布式的快很多。 //开启本地mr set hive.exec.mode.local.auto=true;  //设置local mr的最大输入数据量,当输入数据量小于这个值的时候会采用local mr的方式 set hive.exec.mode.local.auto.inputbytes.max=500

京东放养的爬虫 2693

hive(3)——使用mapreduce

当查询数据复杂时,hive就会调用hadoop里的mapreduce,前提:开启hdfsyarn服务。 此时,看可视化工具: 已经成功运行

weixin_48445640的博客 640

mysql中的去重

关于 distinct 关键字 select DISTINCT uid, name from zzzz; 其真正的意思是去掉重复的记录,先 select uid, name from zzzz; 然后过滤掉重复记录,保留第一条记录。所以,dinstinct的结果取决于你查找的字段,它并不是过滤掉某个字段。 如果我们只需要过滤掉重复的 uid 呢? select uid, name from zz...

猛犸象 1196

hive中reduce类函数说明

order by 需要reduce操作,且只有一个reduce,与配置无关。数据量很大时,慎用。 group by 使用了reduce操作,受限于reduce数量,设置reduce参数mapred.reduce.tasks 输出文件个数与reduce数相同 数据倾斜,优化参数hive.groupby.skewindata为true,会启动一个优化程序,避免数据倾斜。...

千淘万漉 4071

MapReduceHive

1,MapReduce原理,Wordcount的过程1.1,Mapreduce是一个计算框架,既然是做计算的框架,那么表现形式就是有个输入(input),mapreduce操作这个输入(input),通过本身定义好的计算模型,得到一个输出(output),这个输出就是我们所需要的结果。1.2,对待大数据处理:分而治之,大数据的并行化计算1.3,不可分拆的计算任务或相互间有依赖关系的数据无法进行并...

Albert_ycl的博客 8414

MapReduce+Hive的日志分析

1.idea测试连接hdfs package com.lenovo; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import java.io.IOException; public class hdfs { public static void main(String[] args) throws IOException { Configurati

m0_55834564的博客 1777

SQL distinct 去除重复数据 删除

SELECT distinct * FROM StandardProduct

KingCruel的专栏 1295
上一篇: yarn container内存调优——防止container被kill
下一篇: map/reduce的原理| hive 用户手册| hive SERDE | map参数调整 | UDF
a11123939
博客等级 码龄15年 9粉丝 36原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值