2013-07-30 2 views
5

J'ai le code suivant.J'essaie de récupérer toutes les lignes dans la table donnée la famille de la colonne. J'ai été capable d'obtenir toutes les lignes mais la sortie n'est pas ce que je m'attendais. Je reçois une sortie qui montre la clé et l'horodatage mais pas la valeur. Pourquoi les valeurs des lignes ne sont-elles pas affichées? S'il vous plaît aider. La sortie est donnée ci-dessous:Obtenir toutes les valeurs de toutes les lignes dans Hbase en utilisant Java

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

// code pour obtenir toutes les lignes de 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); 
} 
} 

Répondre

5

ici est un code pour scanner la famille colonne « marques » dans le tableau. En l'utilisant, vous pouvez obtenir la ligne, la colonne, l'horodatage et la valeur.

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

Pour obtenir toutes les lignes avec toutes les colonnes, vous n'avez pas besoin de faire appel à nouveau à l'intérieur de votre boucle for. Essayez quelque chose comme ça.

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

Cela ressemble beaucoup mieux. – Tariq

8

Je voudrais proposer une solution sans méthodes dépréciées

//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

vous pouvez trouver plus d'exemples là https://github.com/glebmtb/hbase_example/blob/master/src/main/java/ru/n5g/hbaseclient/SimpleHBaseClient.java –

0

Avec les nouvelles API Hbase, le code est comme ceci:

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); 
     } 
    } 
Questions connexes