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

如何获取带有时间戳的HBase单元版本

屠昌胤
2023-03-14
问题内容

如何使用Get.setMaxVersions(10)方法返回HBase单元的所有带时间戳的版本,其中10是任意数字(可能是20或5之类的东西)?以下是控制台的主要方法,该方法创建一个表,插入10个随机整数,然后尝试检索所有整数以打印出来。

public static void main(String[] args)
    throws ZooKeeperConnectionException, MasterNotRunningException, IOException, InterruptedException {

final String HBASE_ZOOKEEPER_QUORUM_IP = "localhost.localdomain"; //set ip in hosts file
final String HBASE_ZOOKEEPER_PROPERTY_CLIENTPORT = "2181";
final String HBASE_MASTER = HBASE_ZOOKEEPER_QUORUM_IP + ":60010";

//identify a data cell with these properties
String tablename = "characters";
String row = "johnsmith";
String family = "capital";
String qualifier = "A";

//config
Configuration config = HBaseConfiguration.create();
config.clear();
config.set("hbase.zookeeper.quorum", HBASE_ZOOKEEPER_QUORUM_IP);
config.set("hbase.zookeeper.property.clientPort", HBASE_ZOOKEEPER_PROPERTY_CLIENTPORT);
config.set("hbase.master", HBASE_MASTER);

//admin
HBaseAdmin hba = new HBaseAdmin(config);

//create a table
HTableDescriptor descriptor = new HTableDescriptor(tablename);
descriptor.addFamily(new HColumnDescriptor(family));
hba.createTable(descriptor);
hba.close();

//get the table
HTable htable = new HTable(config, tablename);

//insert 10 different timestamps into 1 record
for(int i = 0; i < 10; i++) {
    String value = Integer.toString(i);
    Put put = new Put(Bytes.toBytes(row));
    put.add(Bytes.toBytes(family), Bytes.toBytes(qualifier), System.currentTimeMillis(), Bytes.toBytes(value));
    htable.put(put);
    Thread.sleep(200); //make sure each timestamp is different
}

//get 10 timestamp versions of 1 record
final int MAX_VERSIONS = 10;
Get get = new Get(Bytes.toBytes(row));
get.setMaxVersions(MAX_VERSIONS);
Result result = htable.get(get);
byte[] value = result.getValue(Bytes.toBytes(family), Bytes.toBytes(qualifier));  // returns MAX_VERSIONS quantity of values
String output = Bytes.toString(value);

//show me what you got
System.out.println(output); //prints 9 instead of 0 through 9
}

输出为9(因为循环在i = 9处结束,并且在Hue的HBase Browser Web
UI中看不到多个版本。我该怎么做以修复版本,以便为0-9而不是10给出单独的结果)数字9的一项结果?


问题答案:

您应该在Result上使用getColumnCells来获取所有版本(取决于您在Get中设置的MAX_VERSION_COUNT个)。getValue返回最新值。

样例代码

    List<Cell> values = result.getColumnCells(Bytes.toBytes(family), Bytes.toBytes(qualifier));
    for ( Cell cell : values )
    {
        System.out.println( Bytes.toString( CellUtil.cloneValue( cell ) ) );
    }


 类似资料:
  • 问题内容: 如何使用Get.setMaxVersions(10)方法返回HBase单元的所有带时间戳的版本,其中10是任意数字(可能是20或5之类的东西)?以下是控制台的主要方法,该方法创建一个表,插入10个随机整数,然后尝试检索所有整数以打印出来。 输出为9(因为循环在i = 9处结束,并且在Hue的HBase Browser Web UI中看不到多个版本。我该怎么做以修复版本,以便为0-9而不

  • 在hbase中,我有很多列:name,city,... 不是所有列都有值(例如,有些行只能有'name') 我想提取一行中的所有列+列的时间戳(按特定顺序),如果值为null,我想返回空字符串。 我面临的问题是,我必须通过'family'和'qualifier'访问中的列(我不能通过的索引访问,因为空值被跳过)

  • 我编写了一个简单的测试程序来插入一行。与普通HBase Put示例程序的唯一不同之处在于,Put实例及其KeyValue实例是用时间戳创建的。 预期的行为是插入行。但是,在我的HBase环境中,没有插入行。 下面是我的测试程序。 该程序生成的控制台输出如下所示。 而hbase shell中的“scan”表示“0行(s)”。

  • 我选择“无时区”是因为我知道我的应用程序使用的所有时间戳总是UTC。就我得到的文档而言,“with timestamp”的唯一区别是,我可以提供其他时区的值,然后将其转换为UTC。然而,我想避免这样的自动转换,因为如果我知道我的值是UTC,它们几乎没有任何好处。 当我在测试表中添加新记录并使用pgAdmin查看表的内容时,我可以看到插入日期已正确地保存为UTC格式。 但是,当我尝试使用JDBC选择

  • 我有问题设置行时间戳使用Java API。 当我试图将时间戳值添加到put构造函数(或put.add())中时,什么也不会发生,从表中读取行后,我会得到系统提供的时间戳。 在独立模式下运行的HBase 0.92.1。 提前感谢您的帮助!

  • 问题内容: 在编写Web应用程序时,将 所有 日期时间(服务器端)存储在数据库中作为UTC时间戳是有意义的。 当我发现您无法在JavaScript中对时区进行操作方面自然无法做到这一点时,我感到非常惊讶。 我稍微扩展了Date对象。这个功能有意义吗?基本上,每次我向服务器发送任何内容时,都会使用该功能格式化时间戳记。 您在这里看到任何重大问题吗?还是从另一个角度解决问题? 在我看来,这有点令人费解