2016-02-20 63 views
0

使用java API我想在我的HBase數據庫中插入數據。我需要在插入之前創建一個看跌類,像這樣:如何在java中爲HBase插入數據生成行名稱

Put p = new Put(Bytes.toBytes("row1")); 

我的程序需要從用戶數據,並把數據庫但問題是行名稱(這裏ROW1)需要插入,但我不知道如何唯一地和自動地生成它,因爲對於每一行它應該是不同的,如果不是,它會覆蓋數據。

這裏是我的代碼:

String fName, lName, number ; 
    Scanner in = new Scanner (System.in) ; 
    System.out.println("Wainting for taking new phone number info ...\n"); 
    System.out.println("Please Enter first name : "); 
    fName = in.nextLine() ; 
    System.out.println("Please Enter last name : "); 
    lName = in.nextLine() ; 
    System.out.println("Please Enter number : "); 
    number = in.nextLine() ; 


    Configuration config = HBaseConfiguration.create(); 
    HTable hTable = new HTable(config, "phoneList"); 
    Put p = new Put(Bytes.toBytes("row1")); 
    p.add(Bytes.toBytes("personal"), Bytes.toBytes("firstName") 
      ,Bytes.toBytes(fName)); 
    p.add(Bytes.toBytes("personal"), Bytes.toBytes("lastName") 
      ,Bytes.toBytes(lName)); 
    p.add(Bytes.toBytes("phone"), Bytes.toBytes("number") 
      ,Bytes.toBytes(number)); 
    hTable.put(p); 
    hTable.close(); 

    in.close(); 

回答

0

這取決於你想怎麼rowkey是。在HBase中,因爲行鍵是唯一的索引,並且當您嘗試使用相同的rowkey並嘗試將數據插入到已存在的列中時,它將嘗試覆蓋數據。您可以使用與其關聯的時間戳進行驗證。如果您指定了新列,則數據不會被覆蓋。

一種方法可以獲取該表的最後一行,並增加價值,並在表中插入該行:

Scan bigtableScan = new Scan(); 
List<Result> getResults = null; 
try(ResultScanner bigTableResults = bigtableTable.getScanner(bigtableScan)){ 
    getResults = new ArrayList<>(); 
    for(Result bigTableResult = bigTableResults.next(); (bigTableResult != null); 
     bigTableResult = bigTableResults.next()) { 
     getResults.add(bigTableResult); 
    } 
} 

導航到結果列表的最後一行。從結果得到的行,你可以這樣做:

for(Result hbaseResult : getResult){ 
    String rowKey = Bytes.toString(hbaseResult.getRow()); 
} 

一次,你有最後一排,你可以使用自己的邏輯來得到一個新的行和表中插入行。

0

rowkey不是行名稱。其實它是每列的行鍵。當您想要在HBase中插入或更改行時,需要提供行密鑰。

基於HBase Documentation,在類似BigTable的數據存儲中增加/產生行鍵是有問題的,因此不推薦使用。

您可以檢查是否存在rowkey下面以下幾點:

Get get = new Get(rowkey); 
Result result = htable.get(get); 
if (!result.isEmpty()) { 
throw new Exception("Row with this key already exists."); 
} 
相關問題