hbase java api未持久化任何整数值

4bbkushb  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(319)

我正在尝试将age作为number int bytes.tobytes(44)插入htable,但该值没有被持久化。行键也是如此。我正在使用cloudera快速入门虚拟机:以下是我的代码:

package com.sohi.put;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.util.Bytes;

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

    Configuration conf = HBaseConfiguration.create();

    HBaseAdmin hBaseAdmin = new HBaseAdmin(conf);

    TableName  tableName = TableName.valueOf("SampleDataTable") ;

    HTableDescriptor tableDescriptor = new HTableDescriptor(tableName) ;

    HColumnDescriptor personalColFam = new HColumnDescriptor("personal");
    HColumnDescriptor officeColFam = new HColumnDescriptor("office");

    tableDescriptor.addFamily(personalColFam);
    tableDescriptor.addFamily(officeColFam);

    if(!hBaseAdmin.tableExists(tableName)){
        hBaseAdmin.createTable(tableDescriptor);
    }

    HTable hTable = new HTable(conf, tableName);

    byte [] row  = Bytes.toBytes(121);
    byte [] personalCf  = Bytes.toBytes("personal");
    byte [] officeCf  = Bytes.toBytes("office");
    byte [] qual1  = Bytes.toBytes("name");
    byte [] qual2  = Bytes.toBytes("age");
    byte [] qual3  = Bytes.toBytes("location");

    byte [] name  = Bytes.toBytes("John");
    byte [] age  = Bytes.toBytes(44);
    byte [] loc  = Bytes.toBytes("USA");

    Put data = new Put(row);
    data.add(personalCf, qual1, name);
    data.add(personalCf, qual2, age);
    data.add(officeCf, qual3, loc);

    hTable.put(data);

    // giving issue with integer values like age and row key
    System.out.println("Done");

}

}
以下是输出:

注意键值和年龄值。

mf98qq94

mf98qq941#

hue的hbase浏览器在正确显示字符串方面做得很好,但在其他数据类型方面做得不好。原因很简单:hbase不知道您存储了什么数据类型—但是您知道!例如,如果从hbase列读取8个字节,则可以是64位整数、浮点或8个字符。
现在,回到您的问题:您的代码运行得非常好!
你看到的逗号是 44 (见http://www.ascii-code.com/)
在代码中从hbase读回数据时,请使用 Bytes.toInt() 你就能正确地把它读作整数 44 .

o7jaxewo

o7jaxewo2#

通常建议使用字符串。但如果需要,我们也可以使用数字。为此,请尝试使用 Package 类biginteger。

byte[] val = BigInteger.valueOf(44).toByteArray();

相关问题