当前位置: 首页 > 面试题库 >

多行文字到一张地图

怀飞扬
2023-03-14
问题内容

我一直在尝试使用Hadoop将N条线发送到单个映射。我不需要将行拆分。

我尝试使用NLineInputFormat,但是,它会将数据中的N行文本一次发送到每个映射器[在第N行之后放弃]。

我试图设置该选项,它只需要N行输入,一次将其发送到每张地图的一行:

    job.setInt("mapred.line.input.format.linespermap", 10);

我发现了一个邮件列表,建议我重写LineRecordReader :: next,但这并不是那么简单,因为内部数据成员都是私有的。

我刚刚检查了NLineInputFormat的源代码,并将其硬编码为LineReader,所以覆盖将无济于事。

另外,顺便说一句,我正在使用Hadoop 0.18与Amazon EC2 MapReduce兼容。


问题答案:

您必须 实现自己的输入格式 。您还可以定义自己的记录读取器。

不幸的是,您必须定义一个getSplits()方法。在我看来,这比实现记录读取器更难:此方法必须实现逻辑以对输入数据进行分块。

请参见“ Hadoop-权威指南”中的以下摘录(我将永远推荐一本好书!):

这是界面:

public interface InputFormat<K, V> {
  InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;
  RecordReader<K, V> getRecordReader(InputSplit split,
                                     JobConf job, 
                                     Reporter reporter) throws IOException;
}

JobClient调用getSplits()方法,将所需数量的地图任务作为numSplits参数传递。该数字被视为提示,因为InputFormat实现可以自由地将不同数量的拆分返回到numSplits中指定的数字。计算完分割后,客户端将其发送给作业跟踪器,该跟踪器使用其存储位置来计划地图任务以在任务跟踪器上对其进行处理。

在tasktracker上,地图任务将拆分传递到InputFormat的getRecordReader()方法,以获取该拆分的RecordReader。RecordReader仅仅是对记录的迭代器,并且map任务使用一个来生成记录键值对,并将其传递给map函数。一个代码片段(基于MapRunner中的代码)说明了这个想法:

K key = reader.createKey();
V value = reader.createValue();
while (reader.next(key, value)) {
  mapper.map(key, value, output, reporter);
}


 类似资料:
  • 本节将帮助您一步一步创建一张地图。该地图的最终效果如下。 分享链接:http://d.dituzhe.com/ShareMap/0EB1C2 1 地图分析 该地图包含两个图层,一个是点图层,指我们的店铺信息。一个是面图层,指我们的销售区域。下面将介绍如何创建这些数据,以及如何将这些数据添加到地图中,并设置数据的显示样式。 2 创建店铺数据 点击首页的“数据管理”页面,进入后点击“新增数据”按钮 在

  • 试图将一个范围从Sheet1复制到31张表上的相同范围,但仍然得到“运行时错误1004:工作表类的粘贴方法失败”,调试器指示是问题所在。我可以复制到一张单张没有问题,但不能复制到多张。我试着到处找,但不知道问题是什么(可能也很简单)。

  • 问题内容: 我是第一次在MacOSX上使用Postgres 9.3创建数据库。 假设我有桌和。开始时是空的和已填充的。我想的条目的数量在列在表为等于每个表等表的下方。因此,应包含每个唯一的入口和计数。我还不习惯这种语法,所以我真的不知道该怎么做。该列是多余的。 表 表 这将是正确的解决方法吗? 问题答案: 回答原始问题 Postgres允许集合返回函数(SRF)乘以行。 是你的朋友: 自 Post

  • 我有以下脚本: 这是我找到脚本的原始帖子:https://support.google.com/docs/forum/AAAABuH1jm0hR40qh02UWE/?hl=en 我想对代码做一些小的调整,但不知道从哪里开始。 目前,当在G列中输入“Y”时,它复制整行,并将行内容放在ORDERS!的最后一行!。 我想让它做的是: 1) 仅复制订单最后一行上的B、C和E列!2) 在中删除E和F中的值!

  • 问题内容: 我刚刚开始研究Java 8,并尝试了lambda,我认为我想尝试重写最近写的一件非常简单的东西。我需要将字符串映射到列映射转换为另一个字符串映射到列映射,其中新映射中的列是第一个映射中列的防御性副本。列具有复制构造函数。到目前为止,我最接近的是: 但我敢肯定,必须有更好的方法来完成这项工作,对于您的建议我将不胜感激。 问题答案: 您可以使用收集器:

  • 本文向大家介绍vim 一次将文字插入多行,包括了vim 一次将文字插入多行的使用技巧和注意事项,需要的朋友参考一下 示例 按Ctrl+v进入可视块模式。 使用↑/ ↓/ j/k选择多行。 按Shift+i并开始输入所需内容。 按之后Esc,文本将插入到您选择的所有行中。 请记住,Ctrl+c不是100%等价的,Esc在这种情况下将不起作用! 在可视块模式下,可以按Shift+的微小变化i: 键 描