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

时间:2023-02-07 21:22:38

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

包括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页