很少有人会这样来自问自己?只知道,以键值对的形式处理数据并输出结果,而没有解释为什么要以键值对的形式进行。

包括hadoop的mapreduce里的键值对,spark里的rdd里的map等。

  这是为什么呢?

  

1、键值对的具体含义

  首先,我们会通过强调Java标准库中的类似概念,来阐明我们所说的键值对的含义。

java.util.Map接口是常用类,如HashMap,甚至原始Hashtable的父类(通过向后重构代码库)。

  对于任何Java Map对象,其内容是从指定类型的给定键到相关值的一组映射,键与值的数据类型可能不同。例如,一个HashMap对象可以包含从人名(String)到其生日(Date)的一组映射。

  Hadoop中的数据包含与相关值关联的键。这些数据的存储方式允许对数据集的不同值根据键进行分类和重排。如果使用键值对数据,应该会有如下疑问:

  1、在数据集中,一个给定的键必然有映射值吗?

  2、给定键的关联值是什么?

  3、键的完整集合是什么?

  回忆我们很熟悉的wordcount吧。该程序的输出显然是键/值关系的组合。对于每个字(键),都有对应着它出现的次数(值)。

  键/值数据的一些重要特征就变得清晰起来,具体如下:

  1、键必须是唯一的,而值并不一定是唯一的。

  2、每个值必须与键相关联,但键可能没有值(虽然在这个特定的例子中没有出现这种情况)。

  3、对键进行明确定义非常重要。它决定了计数是否区分大小写,这将产生不同的结果。

  注意,我们需要审慎对待“键是唯一的”这一概念,这并不是说键只出现一次。在我们的数据集中,可以看到键多次出现。并且我们看到,MapReduce模型有一股将所有与特定键关联的数据汇集的步骤。键的唯一性保证了,假如我们为某一给定键汇集对应的值,结果将是从该键的实例到每个值的映射,不会忽略掉任何值。

  

2、为什么会采用键/值数据

  键/值数据作为mapreduce操作的基础,成就了一个强大的编程模型,使mapreduce获得了令人惊讶的广泛应用。hadoop和mapreduce被多种不同行业的问题领域所采用即证实了这一点。很多数据要么本身即为键/值形式,要么可以以键/值这种方式来表示。键值数据这一简单的模型具有广泛的适用性,以这种形式定义的程序可以应用于hadoop和spark框架。

  当然,数据模型本身并非是使hadoop如此强大的唯一要素,它真正的强大之处在于如何运用并行处理技术以及分而治之思想。我们可以在大量主机上存储、执行数据,甚至使用将较大任务分割成较小任务的框架,然后将所有并行结果整合成最终结论。

  但是,我们需要上述框架提供一种描述问题的方法,即便用户不懂该框架的运行机理,也能表达清楚要处理的问题。我们只需要对数据所需的转换进行描述,其余事情由该框架完成。

  mapreduce利用其键/值接口提供了这样的抽象:程序员只需指定所要求的转换,hadoop完成对任意规模数据集的复杂的数据转换处理过程。

  一些实际应用

  为了更为具体的理解键值对,可以想象一些实际应用的键值对数据:

  通讯簿将一个名字(键)和联系方法(值)关联起来;

  银行账号使用一个账号(键)关联账户明细(值);

  一本书的索引关联一个关键字(键)和其所在的页码(值);

  在计算机文件系统中,根据文件名(键)访问各类数据,如文本、图片和语音(值)。

  我这里,刻意列举了一些范围宽泛的例子,帮助你认识到,键/值数据并不是只能应用于高端数据挖掘的约束模型,其实啊,就环绕在我们身边的非常普通的类型啊!

摘自于:Hadoop基础教程   张治起译  的第44-46页

Hadoop概念学习系列之谈hadoop/spark里为什么都有,键值对呢?(四十)的更多相关文章

  1. Hadoop概念学习系列之谈hadoop/spark里为什么都有,YARN呢?(四十一)

    在Hadoop集群里,有三种模式: 1.本地模式 2.伪分布模式 3.全分布模式 在Spark集群里,有四种模式: 1.local单机模式 结果xshell可见: ./bin/spark-submit ...

  2. Hadoop概念学习系列之谈hadoop/spark里分别是如何实现容错性?(四十二)

    Hadoop使用数据复制来实现容错性(I/O高) Spark使用RDD数据存储模型来实现容错性.  RDD是只读的.分区记录的集合.如果一个RDD的一个分区丢失,RDD含有如何重建这个分区的相关信息. ...

  3. Hadoop概念学习系列之为什么hadoop/spark执行作业时,输出路径必须要不存在?(三十九)

    很多人只会,但没深入体会和想为什么要这样? 拿Hadoop来说,当然,spark也一样的道理. 输出路径由Hadoop自己创建,实际的结果文件遵守part-nnnn的约定. 如何指定一个已有目录作为H ...

  4. Hadoop概念学习系列之Hadoop新手学习指导之入门需知(二十)

    不多说,直接上干货! 零基础学习hadoop,没有想象的那么困难,也没有想象的那么容易.从一开始什么都不懂,到能够搭建集群,开发.整个过程,只要有Linux基础,虚拟机化和java基础,其实hadoo ...

  5. Hadoop概念学习系列之Java调用Shell命令和脚本,致力于hadoop/spark集群(三十六)

    前言 说明的是,本博文,是在以下的博文基础上,立足于它们,致力于我的大数据领域! http://kongcodecenter.iteye.com/blog/1231177 http://blog.cs ...

  6. Hadoop概念学习系列之Hadoop、Spark学习路线(很值得推荐)(十八)

    不多说,直接上干货! 说在前面的话 此笔,对于仅对于Hadoop和Spark初中学者.高手请忽略! 1 Java基础: 视频方面:          推荐<毕向东JAVA基础视频教程>.学 ...

  7. Hadoop概念学习系列之Hadoop、Spark学习路线(很值得推荐)

    说在前面的话 此笔,对于仅对于Hadoop和Spark初中学者.高手请忽略! 1 Java基础: 视频方面:          推荐<毕向东JAVA基础视频教程>.学习hadoop不需要过 ...

  8. Hadoop概念学习系列之Hadoop、Spark学习路线

    1 Java基础: 视频方面:          推荐<毕向东JAVA基础视频教程>.学习hadoop不需要过度的深入,java学习到javase,在Java虚拟机的内存管理.以及多线程. ...

  9. Hadoop概念学习系列之如何去找到历史版本的Hadoop发行包(三十四)

    如何去找到历史版本的Hadoop发行包 找到Hadoop历史版本 这里我需要的Hadoop版本是2.0.3.打开hadoop的下载页面 http://www.apache.org/dyn/closer ...

随机推荐

  1. 牛客国庆集训派对Day1-C:Utawarerumono(数学)

    链接:https://www.nowcoder.com/acm/contest/201/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言20 ...

  2. Beta周第7次Scrum会议(11/16)【王者荣耀交流协会】

    一.小组信息 队名:王者荣耀交流协会 小组成员 队长:高远博 成员:王超,袁玥,任思佳,王磊,王玉玲,冉华 小组照片 二.开会信息 时间:2017/11/16 17:03~17:17,总计14min. ...

  3. 组合数的求法 (n<=1e8 可以过来看)

    C(n,m) =n!/(m!* (n-m)!  ); o(n) 求 1-m的逆元 o(n) 求 n的阶乘 代码实现 https://www.cnblogs.com/linyujun/p/5194189 ...

  4. CH3B16 魔法珠

    题意 3B16 魔法珠 0x3B「数学知识」练习 描述 Freda和rainbow是超自然之界学校(Preternatural Kingdom University,简称PKU)魔法学院的学生.为了展 ...

  5. git pull refusing to merge unrelated histories

    1. 简介 最近的项目开发环境我换到实验室的机器上了,毕竟是台式机,速度杠杠的.于是出现了一个问题,台式机上面的代码我笔记上的代码同步的问题.于是想到了Git这个强大的工具.关于git的简介我就不说了 ...

  6. mac sz rz file tras

    安装Zmodem的实现 brew install lrzsz 下载 iterm2-send-zmodem.sh 和 iterm2-recv-zmodem.sh 到路径/usr/local/bin/   ...

  7. oracle完全之dbf文件出现问题, ORA-01219

    alter database datafile '/data/app/oradata/ora237/users01.dbf' offline drop; 强制删除该故障文件

  8. pushpin openresty 集成试用

    pushpin 是一个很不错的将restapi 转换为reailtime api 的proxy,openresty 具有很强的nginx 控制能力 可以方便的用来进行api 的开发,默认其他语言pus ...

  9. VS中实时获取SVN的版本号并写入到AssemblyInfo.cs中

    在开发项目时,需要知道当前发布的到底是哪个版本,比较好的方式就是获取SVN的版本来作为项目的版本.项目版本一般由主版本.次版本.内部版本.修改版本四个部分组成,我们获取的SVN版本就作为修改版本即可. ...

  10. docker nginx 运行后无法访问

    ## 1 最近在学docker部署,一开始打算将nginx先docker化的. 对照官方的docker镜像介绍说明,进行自定义配置 将官方的nginx.conf复制出来后,修改添加了一些自定义,主要是 ...