很少有人会这样来自问自己?只知道,以键值对的形式处理数据并输出结果,而没有解释为什么要以键值对的形式进行。
包括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页