2014-10-27 43 views
1

我試圖插入年齡作爲編號int Bytes.toBytes(44)HTable但價值不被持久。 Row鍵也一樣。我使用Cloudera的快速啓動VM: 這裏是我的代碼:Hbase Java Api不持久化任何整數值

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"); 


} 

}

這裏是輸出:

Put Output

注意的關鍵價值和時代價值。

回答

3

色調的HBase的瀏覽器無法正確顯示字符串的一個好工作 - 但其他數據類型。原因很簡單:Hbase不知道你存儲了什麼數據類型 - 但你知道!例如,如果您從HBase列中讀取8個字節,則可能是64位整數或浮點數或8個字符。

現在,回到您的問題:您的代碼正常工作得很好

你看到逗號是44 ASCII碼錶示(見http://www.ascii-code.com/

當您從HBase的數據讀回在你的代碼,使用Bytes.toInt(),你就可以正確讀取它作爲整數44

+0

謝謝Manu。有效。 – Sohi 2014-10-28 15:54:46

+0

當然馬努。榮幸 – Sohi 2014-10-28 16:12:14

0

總是建議使用字符串。但如果需要,我們也可以使用數字。爲此,請嘗試使用包裝類 - BigInteger。

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

仍然它是添加逗號而不是實際值。我是HBase的新手。爲什麼只考慮String值? – Sohi 2014-10-28 04:12:31

+0

內容將被Base64編碼..您需要通過Base64解碼整數的內容才能得到完全相同的值。在字符串的情況下,它會默認自動處理。 – 2014-10-28 08:41:33