2016-05-30 11 views
3

Ich bin mit der CellUtil Klasse in verpackt org.apache.hadoop.hbase ein Zelle Objekt zu erstellen. Der Funktions-Header sieht so aus:CellUtil: Schlüsseltyp in createCell Methode

public static Cell createCell(byte[] row, byte[] family, byte[] qualifier, long timestamp, byte type, byte[] value) 

Was macht der 5.? Argument Byte Typ darstellen? Ich schaute in die KeyValueType Klasse und es bezieht sich auf eine Enum genannt Typen mit folgenden Definition:

public static enum Type { 
Minimum((byte)0), 
Put((byte)4), 

Delete((byte)8), 
DeleteFamilyVersion((byte)10), 
DeleteColumn((byte)12), 
DeleteFamily((byte)14), 

// Maximum is used when searching; you look from maximum on down. 
Maximum((byte)255); 

private final byte code; 

Type(final byte c) { 
    this.code = c; 
} 

public byte getCode() { 
    return this.code; 
} 

Meine Frage ist, was die Art Minimum hat, setzt usw. bekam mit der Art der Zelle zu tun, ich will erschaffen?

Antwort

3

Sarin, Bitte beachten 69.7.6. KeyValue

Es gibt einige Szenarien, in denen Sie diese Aufzählungen verwenden. Zum Beispiel schreibe ich Koprozessor wie unten, dann werde ich KeyValue.Type.Put.getCode() verwenden, ähnlich wie andere Enums können auch so verwendet werden. Siehe Beispiel Co-Prozessor-Auslastung unter ...

package getObserver; 

import java.io.IOException; 
import java.util.List; 
import java.util.NavigableSet; 

import org.apache.hadoop.hbase.Cell; 
import org.apache.hadoop.hbase.CellUtil; 
import org.apache.hadoop.hbase.KeyValue; 
import org.apache.hadoop.hbase.client.Get; 
import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver; 
import org.apache.hadoop.hbase.coprocessor.ObserverContext; 
import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; 

public class Observer extends BaseRegionObserver{ 

    private boolean isOewc; 

    @Override 
    public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> arg0, 
      Get arg1, List<Cell> arg2) throws IOException { 
     NavigableSet<byte[]> qset = arg1.getFamilyMap().get("colfam1".getBytes()); 
     if(qset==null){//do nothing 

     }else{ 

      String message = "qset.size() = "+String.valueOf(qset.size()); 
      String m = "isOewc = "+String.valueOf(isOewc); 
      this.isOewc = true; 
      Cell cell = CellUtil.createCell(
        "preGet Row".getBytes(), 
        m.getBytes(), 
        message.getBytes(), 
        System.currentTimeMillis(), 
        KeyValue.Type.Put.getCode(), 
        "preGet Value".getBytes()); 
      arg2.add(cell); 
     } 
    } 

    @Override 
    public void postGetOp(ObserverContext<RegionCoprocessorEnvironment> arg0, 
      Get arg1, List<Cell> arg2) throws IOException { 
     String m = "isOewc = "+String.valueOf(isOewc); 
     Cell cell = CellUtil.createCell(
       "postGet Row".getBytes(), 
       m.getBytes(), 
       "postGet Qualifier".getBytes(), 
       System.currentTimeMillis(), 
       KeyValue.Type.Put.getCode(), 
       "postGet Value".getBytes()); 
     arg2.add(cell); 
    } 
} 

ähnlich andere unter EnumTypes kann verwendet werden, wenn Sie nicht wissen, welche Betreiben Sie auf Koprozessor Ereignisse ausführen werden ..

enter image description here

programcreek examples erklärt deutlich, was die Verwendung von Put ist, löschen Maximum (Schlüsselwertepaare für die Mutation vorbereiten), Minimum (für Bereich c Teufel). Auch der obige Co-Prozessor verwendet Put.

+0

Können Sie die Verwendung von Put, Minimum, Maximum und Löschen? Nur ein einziger Liner würde ausreichen. – Sarin

+0

Über dem Code, der gegeben wurde, ist Co-Prozessor. Co-Prozessor funktioniert wie ein Auslöser. Wenn dieses Ereignis eintritt, was getan werden muss, entweder Put, Delete oder etwas anderes, kann man das Enum passieren. das ist die Verwendung. –

+0

Lass es mich anders ausdrücken. Angenommen, ich schreibe einen MR-Unit-Test und möchte mithilfe von CellUtil eine Zelle erstellen. Welche der oben genannten sollte ich verwenden und warum. – Sarin