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

包括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. 测试那些事儿—浅谈TCP/IP协议

    TCP/IP协议是一系列网络协议的总和,是构成网络通信的核心骨架. TCP/IP的工作原理通俗的讲就是一个主机的数据要经过哪些过程才能发送到对方的主机上. TCP/IP协议采用四层结构,分别为应用层, ...

  2. 大整数四则运算------(c++ 实现 乘法没有用傅里叶变换)

    /* 优点: 1 支持负整数的运算 2 良好的输出形式 没有前导零 3 支持cin直接输入 支持cout直接输出 4 支持整数的直接赋值 big_int x=100; 缺点: 1 封装不好 基本都是友 ...

  3. error: ld returned 1 exit status 解决

    1.程序未结束运行 2.全局变量冲突,不是宏定义冲突

  4. Django模型层之多表操作

    ----------------https://www.cnblogs.com/liuqingzheng/articles/9499252.html 实例:我们来假定下面这些概念,字段和关系 一 创建 ...

  5. 走进 AQS 瞧一瞧看一看

    并发中有一块很重要的东西就是AQS.接下来一周的目标就是它. 看复杂源码时,一眼望过去,这是什么?不要慌,像剥洋葱一样,一层层剥开(哥,喜欢"扒开"这个词). 参考资源: http ...

  6. 【BZOJ2820】ygy的gcd

    不知道为什么不想写总结,只是(因为是用别人的权限号交的所以)屯一个代码 #include<iostream> #include<cstdio> #include<algo ...

  7. vue全家桶+Koa2开发笔记(1)--vuex

    1.  安装webpack的问题: webpack坑系列--安装webpack-cli 2.  vue-cli(vue脚手架)超详细教程 3.  在命令行中使用 touch 执行新建文件: 4.  关 ...

  8. 每天进步一点点-写完睡觉-周一工作(java基本数据类型所占的字节和IO流读取的字符和字节)

  9. Gravitee.io Access Management 组件

    Access Management组件在Gravitee.io 主要是进行认证以及权鉴的处理,支持oauth2 以及openid connect 等协议,同时好多功能已经集成在ui 管理界面上了,还是 ...

  10. curl常用传参方式

    1.传header参数curl --header 'Token:40d7c342c110414888cc2a0e1284c636' "127.0.0.1/api/user/baseInfo& ...