Java 如何覆盖Accumulo中SortedKeyValueIterator接口的功能?

Java 如何覆盖Accumulo中SortedKeyValueIterator接口的功能?,java,hadoop,accumulo,Java,Hadoop,Accumulo,我正在尝试创建一个自定义迭代器,但由于没有可用的教程,我查看了Accumulo github页面上提供的代码 在那里,我发现所有类都实现SortedKeyValueIterator并重写其函数 这些函数的作用是什么?在创建实现SortedKeyValueIterator的新类时,重写这些函数的方法应该是什么 这是我试图理解的RowFilter类的示例代码 public void init(SortedKeyValueIterator<Key,Value> source, Map&l

我正在尝试创建一个自定义迭代器,但由于没有可用的教程,我查看了Accumulo github页面上提供的代码

在那里,我发现所有类都实现SortedKeyValueIterator并重写其函数

这些函数的作用是什么?在创建实现SortedKeyValueIterator的新类时,重写这些函数的方法应该是什么

这是我试图理解的RowFilter类的示例代码

 public void init(SortedKeyValueIterator<Key,Value> source, Map<String,String> options, IteratorEnvironment env) throws IOException {
super.init(source, options, env);
this.decisionIterator = new RowIterator(source.deepCopy(env));
}

 public SortedKeyValueIterator<Key,Value> deepCopy(IteratorEnvironment env) {
 RowFilter newInstance;
 try {
       newInstance = getClass().newInstance();
     } catch (Exception e) 
      {
         throw new RuntimeException(e);
      }
  newInstance.setSource(getSource().deepCopy(env));
  newInstance.decisionIterator = new RowIterator(getSource().deepCopy(env));
  return newInstance;
   }
public void init(SortedKeyValueIterator源、映射选项、IteratorEnvironment环境)引发IOException{
super.init(源、选项、环境);
this.decisionIterator=新的行迭代器(source.deepCopy(env));
}
公共分类KeyValueIterator deepCopy(迭代器环境环境){
RowFilter-newInstance;
试一试{
newInstance=getClass().newInstance();
}捕获(例外e)
{
抛出新的运行时异常(e);
}
setSource(getSource().deepCopy(env));
newInstance.decisionIterator=新的行迭代器(getSource().deepCopy(env));
返回newInstance;
}

我想知道,如果我想让另一个类实现SortedKeyValueIterator,这段代码做什么,以及我应该如何重写这些函数。

首先看一下SortedKeyValueIterator上的Javadoc--。这是每个方法都应该做的一个很好的起点

编写迭代器的一个很好的类比是将Accumulo表(迭代器正在对其进行操作)视为一个单链表(按排序顺序)。next()移动到列表中的下一个节点,seek()向前/向下移动,跳过0到多个节点。init()从Accumulo表配置和客户端提供任何必要的配置(迭代器可能在Accumulo服务器中运行)。deepCopy()应该将当前迭代器的确切状态复制到新实例中(类似于Object.clone()

我还可以提供两个自定义迭代器示例:

    • 对给定列族中出现的数字执行中间求和
    • 需要客户端的最终总和
    • 仅返回不包含提供的列集的行
    • 使用WholeRowIterator序列化方法将多个键值对作为单个键值对返回(需要在客户端上进行反序列化)

您还可以查看Accumulo中提供的其他“面向用户”迭代器

从SortedKeyValueIterator上的Javadoc开始。这是每个方法都应该做的一个很好的起点

编写迭代器的一个很好的类比是将Accumulo表(迭代器正在对其进行操作)视为一个单链表(按排序顺序)。next()移动到列表中的下一个节点,seek()向前/向下移动,跳过0到多个节点。init()从Accumulo表配置和客户端提供任何必要的配置(迭代器可能在Accumulo服务器中运行)。deepCopy()应该将当前迭代器的确切状态复制到新实例中(类似于Object.clone()

我还可以提供两个自定义迭代器示例:

    • 对给定列族中出现的数字执行中间求和
    • 需要客户端的最终总和
    • 仅返回不包含提供的列集的行
    • 使用WholeRowIterator序列化方法将多个键值对作为单个键值对返回(需要在客户端上进行反序列化)

您还可以查看Accumulo中提供的其他“面向用户”迭代器一些重要的附加位:seek()将范围内的第一个键/值对作为“top”键/值进行搜索。next()将处理后续对。因此,您可以假设调用方将在seek()之后立即调用getTopKey()/getTopValue(),然后在每次调用后再次调用。此外,考虑扩展包迭代器,因为它实现了基础知识。感谢您提供了函数的清晰解释!!很乐意帮忙。如果您愿意,也可以在上提交问题,我们将在下一版本中尝试更新文档。您能否进一步解释调用这些函数的顺序?谢谢。大致的轮廓是:init(),seek(),repeated(next(),getTopKey()&&getTopValue())。seek()可能在调用任何下一个()之后被调用。e、 g.seek()、next()、next()、next()、seek()、next()、seek()、next()、next()、seek()等。如果您想提交票据,我们很乐意改进文档!一些重要的附加位:seek()将范围seek'd中的第一个键/值对作为“top”键/值进行分级。next()将处理后续对。因此,您可以假设调用方将在seek()之后立即调用getTopKey()/getTopValue(),然后在每次调用后再次调用。此外,考虑扩展包迭代器,因为它实现了基础知识。感谢您提供了函数的清晰解释!!很乐意帮忙。如果您愿意,也可以在上提交问题,我们将在下一版本中尝试更新文档。您能否进一步解释调用这些函数的顺序?谢谢。大致的轮廓是:init(),seek(),repeated(next(),getTopKey()&&getTopValue())。seek()可能在调用任何下一个()之后被调用。e、 g.seek()、next()、next()、next()、seek()、next()、seek()、next()、next()、seek()等。如果您想提交票据,我们很乐意改进文档!