JRQZ
  • 关于
  • 碎片时间
  • 自用笔记

自用笔记

四月 17, 2024

Hive中SQL转化为MapReduce的原理

JOIN操作实现原理 在MapReduce中实现join主要有以下几种方式:Reduce-side join、Map-side join、和Repartition join。下面详细介绍这些方法及其原理。 Reduce-side Join Reduce-side join是MapReduce中最通用的join类型,适用于大规模数据集的连接,特别是当两个数据集都很大且没有任何特殊排序或分区时。 工作原理: Map阶段: Mapper读取两个数据集的所有输入数据(可能来自HDFS的不同文件或目录)。 对每个输入记录,Mapper输出key-value对,其中key是join操作的键,value是包含数据集标识(如标记来自哪个数据集)和数据记录的值。 Shuffle阶段: MapReduce框架将所有Mapper输出的key-value对根据key进行分组和排序,然后分发给Reducers。 Reduce阶段: 每个Reducer接收到特定key的所有记录,这些记录来源于所有的Mapper。Reducer通过检查每条记录的来源数据集标识,将来自不同数据集的记录进行组合。 对于每个key,Reducer执行实际的join逻辑(如inner join, left join等),输出最终的结果。 Map-side Join Map-side join通常在其中一个数据集很小(足够小到可以被加载到内存中)时使用,这种方法效率更高,因为它避免了在Reduce阶段进行大量的数据排序和分组。 工作原理: 预处理阶段: 小的数据集被分发到所有的Mapper节点上,通常通过将其存储在HDFS上并通过DistributedCache机制让每个Mapper节点访问。 Map阶段: 每个Mapper读取大的数据集,并同时加载小的数据集到内存。 Mapper对大数据集的每条记录进行处理,使用内存中的小数据集进行即时join操作。 输出join后的结果。 Repartition Join Repartition join是另一种Reduce-side join的形式,适用于需要特殊排序或分区的场景。 工作原理: 类似于普通的Reduce-side join,但在map阶段会对数据进行额外的分区和排序处理,以优化join的效率。 应用场景 当两个大数据集需要被连接时,使用Reduce-side join。 当一个小数据集可以全局广播到所有Mapper时,使用Map-side join。 当数据需要特殊处理或优化分区时,考虑使用Repartition join。 例如一个Reduce-side Join: select u.name, o.orderid from order o join user u on o.uid = u.uid; 在map的输出value中为不同表的数据打上tag标记,在reduce阶段根据tag判断数据来源。 Group By操作实现原理 Map阶段 任务:读取输入数据,处理记录,并输出键值对。 输出:键是GROUP BY字段,值是需要聚合的数据。 Shuffle阶段 处理:框架自动对Mapper的输出进行排序和分组,确保相同的键被送到同一个Reducer。 Reduce阶段 聚合:Reducer接收到键和对应的值集合,进行数据聚合(如计数、求和)。 结果:输出每个组基于GROUP BY字段的聚合结果。 将GroupBy的字段组合为map的输出key值,利用MapReduce的排序,在reduce阶段保存LastKey区分不同的key。MapReduce的过程如下
继续阅读
四月 12, 2024

ACM模式C++常用io

自用,ai生成 提前引入头文件 #include <bits/stdc++.h> cin cin是C++中处理标准输入的对象,属于iostream库。它用于从标准输入流(通常是键盘)读取数据。 cin会在等待用户输入时阻塞程序执行。具体来说,它在以下几种情况下会阻塞: 等待输入:当程序到达读取输入的语句,且标准输入中没有足够的数据时,cin会阻塞程序,等待用户输入数据并按下回车键。 输入缓冲区不空,但数据不足:如果输入缓冲区中有一部分数据,但不足以满足当前读取操作的需要,cin同样会阻塞,等待更多输入。 cin用作布尔表达式时,能够反映输入操作的状态: 当输入成功时,cin表达为true。 如果遇到输入结束(EOF),或者输入类型与变量类型不匹配(例如,尝试将字母读入整型变量),cin会表达为false。 cin, 作为C++标准库中的输入流对象,可以用来读取多种基本数据类型,以及一些库中定义的复合类型。这里列出了cin可以直接使用的一些常见数据类型: 基本数据类型 整数类型:int, short, long, long long,以及它们的无符号版本 unsigned int, unsigned short, unsigned long, unsigned long long。 浮点数类型:float, double, long double。 字符类型:char,以及unsigned char和signed char。 布尔类型:bool。 复合类型 字符串:std::string。读取时,cin将会读取并忽略任何前导空格(包括空格、换行符等),然后读取字符直到下一个空白字符为止。 对于大多数基本数据类型(如int、double、char等),cin使用>>操作符读取数据时,会自动跳过任何前导的空白字符,包括空格、制表符和换行符。这意味着如果输入缓冲区的开始是空白字符,cin >>会忽略它们,直到找到第一个非空白字符,并从那里开始读取输入。 getchar() getchar()函数会从输入流中读取下一个字符,并且这个字符会被消耗掉,即它会从输入流中移除,不再可用于后续的输入操作。这意味着一旦getchar()读取了一个字符,这个字符就不会再出现在输入流中,无论是cin、scanf还是其他任何读取标准输入的函数,都无法再次访问到这个字符。 getline() std::getline() 是 C++ 标准库中的一个函数,它用于从输入流中读取一行文本。std::getline() 主要与 std::istream 类型(如 std::cin、文件流等)一起使用,能够从给定的输入流中读取数据直到遇到换行符('\n'),并将读取的内容(不包括换行符)存储到一个 std::string 或其他字符序列中。 std::getline() 有几个重载版本,最常用的两个版本的签名如下: 从标准输入流读取: std::istream& getline(std::istream& is, std::string& str, char delim = '\n'); is: 输入流(如 std::cin 或文件输入流)。 str: 存储从输入流中读取的行的字符串。 delim: 可选参数,指定作为行结束符的字符,默认是换行符 '\n'。函数会读取数据直到遇到此字符为止。 从字符串流读取(属于 <sstream> 头文件):
继续阅读
四月 8, 2024

Hugo嵌入图片的几种方式

使用Markdown语法 ![图片替代文字](/img/jrqz/trails_in_the_sky_sc.jpg) *图片说明文本* 不支持调整大小 图片说明文本 使用HTML <figure> <img src="/img/jrqz/trails_in_the_sky_sc.jpg" alt="图片替代文字" width="50%"> <figcaption>这里是图片说明</figcaption> </figure> 需要在hugo.toml(config.toml)中添加设置 [markup.goldmark.renderer] unsafe = true 这里是图片说明 可能会导致代码注入等安全问题 使用Hugo短代码 {{< figure src="/img/jrqz/trails_in_the_sky_sc.jpg" caption="这里是图片说明" >}} 更改图片大小需要定义css样式,较为麻烦 这里是图片说明
继续阅读
  • ««
  • «
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
  • »»
© JRQZ 2025