2013-07-30 6 views
5

Ich habe den folgenden Code.Ich versuche, alle Zeilen in der Tabelle für die Spaltenfamilie abrufen. Ich war in der Lage, alle Zeilen zu bekommen, aber die Ausgabe ist nicht das, was ich erwartet habe. Ich bekomme eine Ausgabe, die den Schlüssel und den Zeitstempel zeigt, aber nicht den Wert. Warum werden die Werte der Zeilen nicht angezeigt? Bitte helfen Sie. Der Ausgang ist unten angegeben:Holen Sie alle Werte aller Zeilen in Hbase mit Java

keyvalues={Justin/marks:total/1375104216267/Put/vlen=7/ts=0, Justin/marks:markPercentage/ 1375104186783/Put/vlen=4/ts=0} 

//-Code alle Zeilen aus hbase

public class GetHbaseData { 
public static void getdata() throws IOException{ 
@SuppressWarnings("resource") 
HTable table = new HTable(HBaseConfiguration.create(), "Student"); 
Scan scan = new Scan(); 
scan.setCaching(20); 

scan.addFamily(Bytes.toBytes("marks")); 
ResultScanner scanner = table.getScanner(scan); 

for (Result result = scanner.next(); (result != null); result = scanner.next()) { 
    Get get = new Get(result.getRow()); 
    Result entireRow = table.get(get); 
    System.out.println(entireRow); 
} 
} 

Antwort

5

hier zu bekommen, ist ein Code, der die „Marken“ Spalte Familie in der Tabelle zu scannen.

mit ihm können Sie die Zeile, Spalte, Zeitstempel und Wert erhalten.

Scan scan = new Scan(); 
    scan.setCaching(hBaseScanCacheSize); 
    scan.setBatch(hbaseScanBatchSize); 
    scan.addFamily(Bytes.toBytes("marks")); 

    ResultScanner resultScanner = table.getScanner(scan); 
    Iterator<Result> iterator = resultScanner.iterator(); 
    while (iterator.hasNext()) 
    { 
     Result next = iterator.next(); 
     for(Entry<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> columnFamilyMap : next.getMap().entrySet()) 
     { 
      for (Entry<byte[], NavigableMap<Long, byte[]>> entryVersion : columnFamilyMap.getValue().entrySet()) 
      { 
       for (Entry<Long, byte[]> entry : entryVersion.getValue().entrySet()) 
       { 
        String row = Bytes.toString(next.getRow()); 
        String column = Bytes.toString(entryVersion.getKey()); 
        byte[] value = entry.getValue(); 
        long timesstamp = entry.getKey(); 
       } 
      } 
     } 
    } 
13

Um alle Zeilen mit allen Spalten zu erhalten, müssen Sie nicht innerhalb der for-Schleife erneut anrufen. Probieren Sie so etwas aus.

for (Result result = scanner.next(); (result != null); result = scanner.next()) { 
    for(KeyValue keyValue : result.list()) { 
     System.out.println("Qualifier : " + keyValue.getKeyString() + " : Value : " + Bytes.toString(keyValue.getValue())); 
    } 
} 
+0

Das sieht viel besser. – Tariq

8

Ich mag Lösung anbieten zu können, ohne veraltete Methoden

//Get 
    Get theGet = new Get(Bytes.toBytes("rowkey1")); 
    Result result = table.get(theGet); 
    //get value first column 
    String inValue1 = Bytes.toString(result.value()); 
    //get value by ColumnFamily and ColumnName 
    byte[] inValueByte = result.getValue(Bytes.toBytes(columnFamily), Bytes.toBytes(columnQualifier1)); 
    String inValue2 = Bytes.toString(inValueByte); 

    //loop for result 
    for (Cell cell : result.listCells()) { 
     String qualifier = Bytes.toString(CellUtil.cloneQualifier(cell)); 
     String value = Bytes.toString(CellUtil.cloneValue(cell)); 
     System.out.printf("Qualifier : %s : Value : %s", qualifier, value); 
    } 

    //create Map by result and print it 
    Map<String, String> getResult = result.listCells().stream().collect(Collectors.toMap(e -> Bytes.toString(CellUtil.cloneQualifier(e)), e -> Bytes.toString(CellUtil.cloneValue(e)))); 
    getResult.entrySet().stream().forEach(e-> System.out.printf("Qualifier : %s : Value : %s", e.getKey(), e.getValue())); 
+0

finden Sie weitere Beispiele dort https://github.com/glebmtb/hbase_example/blob/master/src/main/java/ru/n5g/hbaseclient/SimpleHBaseClient.java –

0

Mit dem neuen HBase APIs, ist der Code wie folgt:

for (Result result = scanner.next(); (result != null); result = scanner.next()) { 
     for(Cell cell : result.listCells()) { 
      String qualifier = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()); 
      String value = Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()); 
      System.out.println("Qualifier : " + qualifier 
        + " : Value : " + value); 
     } 
    } 
Verwandte Themen