gpt4 book ai didi

java - 如何对十六进制行键进行HBase范围扫描?

转载 作者:行者123 更新时间:2023-11-30 01:47:33 25 4
gpt4 key购买 nike

当尝试在 HBase shell 上执行范围扫描时,以下内容在 HBase shell 中有效。

scan 'mytable', {STARTROW => "\x00\x00\x00\x00\x01\x8F\xF6\x83", ENDROW => "\x00\x00\x00\x00\x01\x8F\xF6\x8D"}

但是当尝试实现 Java 客户端来执行相同的操作时,它没有检索到结果。

Scan scan = new Scan(Bytes.ToBytes("\x00\x00\x00\x00\x01\x8F\xF6\x83"),Bytes.toBytes("\x00\x00\x00\x00\x01\x8F\xF6\x8D"); 
scan.setFilter(colFilter);
scan.setOtherStuff...

ResultScanner scanner = table.getScanner(scan);
for (Result result = scanner.next(); result != null; result = scanner.next()) {
....
}

我尝试转义“\”字符并传递开始和结束行键。但并没有达到预期效果。

我将输入数据作为命令行参数传递。

time java -jar $ARIADNE3D_CLI PCRangeSearchTxt -table_name $TABLE_NAME -m 4 -start_key "\x00\x00\x00\x00\x01\x8F\xF6\x8D" -end_key "\x00\x00\x00\x00\x01\x8F\xF6\x8D" -o $SCRATCH/txt-1.txt

PCRangeSearchTxt的Java实现如下

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package umg.ariadne3d.core.query.pc;

import java.io.*;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.PosixParser;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import umg.ariadne3d.core.common.Constants;
import umg.core.common.Executable;

/**
* Point cloud range search.
* @author VVo
*/
public class PCRangeSearchTxt implements Executable {

static Logger LOGGER = Logger.getLogger(PCRangeSearchTxt.class);
public static final String NAME = "PCRANGESEARCHTXT"; //PCRangeSearchTxt

public static void main(String[] args) {
args = new String[]{
// "-t", "d15-tiny-m4",
// "-m", "4",
// "-index", "/Users/vu/scratch/ariadne3d/pointcloud/meta/hilbert.json",
// "-query", "/Users/vu/scratch/ariadne3d/query/q0.json",
// "-las_meta", "/Users/vu/scratch/ariadne3d/pointcloud/meta/d15-meta.json",
// "-o", "/Users/vu/tmp/a.las"
};

Executable prog = new PCRangeSearchTxt();
int err = prog.run(args);
System.exit(err);
}

@Override
public int run(String[] args) {
CommandLine cmd = parseArgs(args);
String tableName = cmd.getOptionValue("t");

String start_key = cmd.getOptionValue("start_key");
String end_key = cmd.getOptionValue("end_key");
final String FILENAME = cmd.getOptionValue("o");

int modelNo = Integer.parseInt(cmd.getOptionValue("m"));

try{
File file = new File(FILENAME);
// if file doesnt exists, then create it
if (!file.exists()) {
file.createNewFile();
}
}catch (IOException e) {

e.printStackTrace();

}

Configuration conf = HBaseConfiguration.create();

String[] connectionParams = null;
if (cmd.hasOption("conn")) {
connectionParams = cmd.getOptionValues("conn");
}

if (connectionParams != null) {
conf.set(Constants.HBASE_CONFIGURATION_ZOOKEEPER_QUORUM, connectionParams[0]);
LOGGER.debug(String.format("Set quorum string %s", conf.get(Constants.HBASE_CONFIGURATION_ZOOKEEPER_QUORUM)));
conf.setInt(Constants.HBASE_CONFIGURATION_ZOOKEEPER_CLIENTPORT, Integer.parseInt(connectionParams[1]));
LOGGER.debug(String.format("Set port %d", conf.getInt(Constants.HBASE_CONFIGURATION_ZOOKEEPER_CLIENTPORT, 0)));
}

try {

long start = System.currentTimeMillis();

Connection connection = ConnectionFactory.createConnection(conf);

HBaseConfiguration.addHbaseResources(conf);

Table table = connection.getTable(TableName.valueOf(tableName));

byte[] keyStart = Bytes.toBytes(start_key);
byte[] keyEnd = Bytes.toBytes(end_key);

Scan scan = new Scan(keyStart, keyEnd);

ResultScanner scanner = table.getScanner(scan);
FileWriter writer = new FileWriter(FILENAME, true);
try{
for (Result result = scanner.next(); result != null; result = scanner.next()) {
writer.write(result.toString()+"\n");


}
}finally {
writer.close();
scanner.close();
}
long end = System.currentTimeMillis();

System.out.printf("Total time %d \n", end - start);

table.close();
connection.close();

return 0;
} catch (IOException ex) {
LOGGER.error(ex);
return 1;
}
}

private static CommandLine parseArgs(String[] args) {
Options options = new Options();

Option o;

// table name
o = new Option("t","table_name", true, "HBase table name");
options.addOption(o);

o = new Option("m", "model_number", true, "model number");
options.addOption(o);

o = new Option("start_key", true, "start key for range scan");
options.addOption(o);

o = new Option("end_key", true, "end key for range scan");
options.addOption(o);
o = new Option("o", "output", true, "create output file");
o.setRequired(false);
options.addOption(o);

// connection parameters
o = new Option("conn", "connection", true, "Zookepper quorum and port");
o.setArgs(2);
o.setRequired(false);
options.addOption(o);

// debug flag
options.addOption("d", "debug", false, "switch on DEBUG log level");

CommandLineParser parser = new PosixParser();
CommandLine cmd = null;

try {
cmd = parser.parse(options, args);
} catch (Exception e) {
System.err.println("ERROR: " + e.getMessage() + "\n");
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp(NAME + " ", options, true);
System.exit(-1);
}

if (cmd.hasOption("d")) {
LOGGER.setLevel(Level.DEBUG);
System.out.println("DEBUG ON");
}

return cmd;
}

}

对十六进制行键实现 HBase 范围搜索的正确方法是什么?

最佳答案

我想您知道 HBase 表中的键是什么,所以我不明白为什么您不能这样做:

byte[]start = Hex.decodeHex("startKey".toCharArray());
byte[]end = Hex.decodeHex("endKey".toCharArray());
Scan scan = new Scan(start, end)

只是不确定为什么你要尝试相反的做法。

否则这里有您的问题的答案: What are the non-hex characters in HBase Shell RowKey?

希望有帮助:)

关于java - 如何对十六进制行键进行HBase范围扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57391102/

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