我正在尝试创建自定义迭代器,但由于没有可用的教程,我查看了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;
}
我想知道,这段代码有什么作用,以及如果我希望另一个类实现 SortedKeyValueIterator,我应该如何覆盖这些函数。
首先看看 SortedKeyValueIterator 上的 Javadoc -- http://accumulo.apache.org/1.6/apidocs/。对于每种方法应该做什么来说,这是一个很好的起点。
编写迭代器的一个很好的类比是将 Accumulo 表(迭代器正在操作的表)视为单链表(按排序顺序)。 next() 移动到列表中的下一个节点,seek() 向前/向下移动,跳过零到多个节点。 init() 提供了来自 Accumulo 表配置和客户端的任何必要配置(您的迭代器可能在 Accumulo 服务器中运行)。 deepCopy() 应该复制确切的状态将当前迭代器迭代到新实例中(类似于 Object.clone())。
我还可以提供两个自定义迭代器的示例:
- https://github.com/joshelser/accumulo-column-summing/
- 对给定列族中出现的数字执行中间求和
- 需要客户端的最终求和
- https://github.com/joshelser/RowsWithoutColumns
- 仅返回不包含提供的列集的行
- 使用 WholeRowIterator 序列化方法将多个键值对作为单个键值对返回(需要在客户端上进行反序列化)
您还可以查看Accumulo中提供的其他"面向用户"的迭代器 http://accumulo.apache.org/1.6/apidocs/org/apache/accumulo/core/iterators/user/package-summary.html