gpt4 book ai didi

java - Java中HBase表的自定义过滤

转载 作者:行者123 更新时间:2023-12-02 07:49:53 25 4
gpt4 key购买 nike

我有几个 HBase 表。它们的 key 方式都不同,但每个 key 都有 32 位整数所有者 ID 作为 key 的一部分。每个表的偏移量不同,但我确实知道这些偏移量。现在,我传入了 ID 集合,并且需要将与传入所有者相关的数据转储到文件中。 IE。我需要执行相当于以下 SQL 语句的操作:

SELECT * FROM table WHERE substr(key_field, offset, length) IN (...);

试图实现我写的东西:

public class SubKeyComparator extends BinaryComparator {

private Set<Integer> idSet;
private int idLength = 4;
private int idOffset = 0;

// getters/setters are here

@Override
public int compareTo(byte[] value) {
return idSet.contains(Bytes.toInt(value, offset, length))? 0 : 1;
}
}

它似乎没有按预期工作。它实际上根本不起作用。我正在打开一张 table ,当我试图获取时

ResultScanner scanner = htable.getScanner(scan);

它等待了一会儿,然后抛出一个 org.apache.hadoop.hbase.client.RetriesExhaustedException,显示了十几个 java.io.EOFExceptionsorg.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1231)

尝试在网络上寻找解决方案或通过 HBase 源代码了解问题所在,但没有产生任何重大结果。如果我不将过滤器插入扫描对象,则一切正常。

如果有人知道出了什么问题或做过类似的事情,我们将不胜感激您的帮助。

最佳答案

首先要注意的是,您已经实现了比较器,而不是过滤器。如果您确实想要一个过滤器,您需要做的是扩展 org.apache.hadoop.hbase.filter.FilterBase

如果您查看 HBase 日志,您可能会看到类似以下内容:

2012-09-20 16:55:27,913 ERROR org.apache.hadoop.hbase.io.HbaseObjectWritable: Can't find class com.mycompany.project.MyCustomComparator
java.lang.ClassNotFoundException: com.mycompany.project.MyCustomComparator
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
{lines removed for brevity}
2012-09-20 16:55:27,913 ERROR org.apache.hadoop.hbase.io.HbaseObjectWritable: Error in readFields
java.io.IOException: Can't find class com.mycompany.project.MyCustomComparator
at org.apache.hadoop.hbase.io.HbaseObjectWritable.readObject(HbaseObjectWritable.java:514)
{lines removed for brevity}
Caused by: java.lang.ClassNotFoundException: com.mycompany.project.MyCustomComparator
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
{lines removed for brevity}
at org.apache.hadoop.hbase.io.HbaseObjectWritable.getClassByName(HbaseObjectWritable.java:549)
at org.apache.hadoop.hbase.io.HbaseObjectWritable.readObject(HbaseObjectWritable.java:511)
... 15 more

这是因为 HBase 服务器的类路径中没有比较器类。

无论哪种情况,都需要编译自定义类并将其部署到所有区域服务器(可能在 JAR 中)并添加到 HBase 类路径中。

关于java - Java中HBase表的自定义过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10342830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com