Class Result
- All Implemented Interfaces:
CellScannable
,CellScanner
,ExtendedCellScannable
,ExtendedCellScanner
Get
or Scan
query.
This class is NOT THREAD SAFE.
Convenience methods are available that return various Map
structures and values directly.
To get a complete mapping of all cells in the Result, which can include multiple families and
multiple versions, use getMap()
.
To get a mapping of each family to its columns (qualifiers and values), including only the latest
version of each, use getNoVersionMap()
. To get a mapping of qualifiers to latest values
for an individual family use getFamilyMap(byte[])
.
To get the latest value for a specific family and qualifier use
getValue(byte[], byte[])
. A Result is backed by an array of Cell
objects, each
representing an HBase cell defined by the row, family, qualifier, timestamp, and value.
The underlying Cell
objects can be accessed through the method listCells()
. This
will create a List from the internal Cell []. Better is to exploit the fact that a new Result
instance is a primed CellScanner
; just call advance()
and current()
to
iterate over Cells as you would any CellScanner
. Call cellScanner()
to reset
should you need to iterate the same Result over again (CellScanner
s are one-shot). If you
need to overwrite a Result with another Result instance -- as in the old 'mapred' RecordReader
next invocations -- then create an empty Result with the null constructor and in then use
copyFrom(Result)
-
Field Summary
Modifier and TypeFieldDescriptionprivate ExtendedCell[]
private int
Index for where we are when Result is acting as aCellScanner
.private Cursor
static final Result
private Boolean
private NavigableMap<byte[],
NavigableMap<byte[], NavigableMap<Long, byte[]>>> private static final int
private static ThreadLocal<byte[]>
private boolean
private static final int
private final boolean
private byte[]
private boolean
private RegionLoadStats
-
Constructor Summary
ModifierConstructorDescriptionResult()
Creates an empty Result w/ no KeyValue payload; returns null if you callrawCells()
.private
Result
(boolean readonly) Allows to construct special purpose immutable Result objects, such as EMPTY_RESULT.private
private
Result
(ExtendedCell[] cells, Boolean exists, boolean stale, boolean mayHaveMoreCellsInRow) Private ctor. -
Method Summary
Modifier and TypeMethodDescriptionboolean
advance()
Advance the scanner 1 cell.private int
binarySearch
(Cell[] kvs, byte[] family, byte[] qualifier) private int
binarySearch
(Cell[] kvs, byte[] family, int foffset, int flength, byte[] qualifier, int qoffset, int qlength) Searches for the latest value for the specified column.For client users: You should only use the return value as aCellScanner
,ExtendedCellScanner
is marked as IA.Private which means there is no guarantee about its API stability.private void
All methods modifying state of Result object must call this method to ensure that special purpose immutable Results can't be accidentally modified.static void
compareResults
(Result res1, Result res2) Does a deep comparison of two Results, down to the byte arrays.static void
compareResults
(Result res1, Result res2, boolean verbose) Does a deep comparison of two Results, down to the byte arrays.boolean
containsColumn
(byte[] family, byte[] qualifier) Checks for existence of a value for the specified column (empty or not).boolean
containsColumn
(byte[] family, int foffset, int flength, byte[] qualifier, int qoffset, int qlength) Checks for existence of a value for the specified column (empty or not).boolean
containsEmptyColumn
(byte[] family, byte[] qualifier) Checks if the specified column contains an empty value (a zero-length byte array).boolean
containsEmptyColumn
(byte[] family, int foffset, int flength, byte[] qualifier, int qoffset, int qlength) Checks if the specified column contains an empty value (a zero-length byte array).boolean
containsNonEmptyColumn
(byte[] family, byte[] qualifier) Checks if the specified column contains a non-empty value (not a zero-length byte array).boolean
containsNonEmptyColumn
(byte[] family, int foffset, int flength, byte[] qualifier, int qoffset, int qlength) Checks if the specified column contains a non-empty value (not a zero-length byte array).void
Copy another Result into this one.static Result
Instantiate a Result with the specified List of KeyValues.static Result
static Result
static Result
static Result
Instantiate a Result with the specified array of KeyValues.static Result
static Result
(package private) static Result
create
(ExtendedCell[] cells) (package private) static Result
create
(ExtendedCell[] cells, Boolean exists, boolean stale) (package private) static Result
create
(ExtendedCell[] cells, Boolean exists, boolean stale, boolean mayHaveMoreCellsInRow) static Result
createCompleteResult
(Iterable<Result> partialResults) Forms a single result from the partial results in the partialResults list.static Result
createCursorResult
(Cursor cursor) current()
For client users: You should only use the return value as aCell
,ExtendedCell
is marked as IA.Private which means there is no guarantee about its API stability.getColumnCells
(byte[] family, byte[] qualifier) Return the Cells for the specific column.getColumnLatestCell
(byte[] family, byte[] qualifier) The Cell for the most recent timestamp for a given column.getColumnLatestCell
(byte[] family, int foffset, int flength, byte[] qualifier, int qoffset, int qlength) The Cell for the most recent timestamp for a given column.Return the cursor if this Result is a cursor result.NavigableMap<byte[],
byte[]> getFamilyMap
(byte[] family) Map of qualifiers to values.NavigableMap<byte[],
NavigableMap<byte[], NavigableMap<Long, byte[]>>> getMap()
Map of families to all versions of its qualifiers and values.NavigableMap<byte[],
NavigableMap<byte[], byte[]>> Map of families to their most recent qualifiers and values.byte[]
getRow()
Method for retrieving the row key that corresponds to the row from which this Result was created.getStats()
Returns the associated statistics about the region from which this was returned.static long
getTotalSizeOfCells
(Result result) Get total size of raw cellsbyte[]
getValue
(byte[] family, byte[] qualifier) Get the latest version of the specified column.getValueAsByteBuffer
(byte[] family, byte[] qualifier) Returns the value wrapped in a newByteBuffer
.getValueAsByteBuffer
(byte[] family, int foffset, int flength, byte[] qualifier, int qoffset, int qlength) Returns the value wrapped in a newByteBuffer
.boolean
isCursor()
Return true if this Result is a cursor to tell users where the server has scanned.boolean
isEmpty()
Check if the underlying Cell [] is empty or notboolean
isStale()
Whether or not the results are coming from possibly stale data.Create a sorted list of the Cell's in this result.boolean
loadValue
(byte[] family, byte[] qualifier, ByteBuffer dst) Loads the latest version of the specified column into the providedByteBuffer
.boolean
loadValue
(byte[] family, int foffset, int flength, byte[] qualifier, int qoffset, int qlength, ByteBuffer dst) Loads the latest version of the specified column into the providedByteBuffer
.boolean
For scanning large rows, the RS may choose to return the cells chunk by chunk to prevent OOM or timeout.private byte[]
notNullBytes
(byte[] bytes) Cell[]
rawCells()
Return the array of Cells backing this Result instance.(package private) ExtendedCell[]
void
void
setStatistics
(RegionLoadStats loadStats) Set load information about the region to the information about the resultint
size()
Returns the size of the underlying Cell []toString()
byte[]
value()
Returns the value of the first column in the Result.
-
Field Details
-
cells
-
exists
-
stale
-
mayHaveMoreCellsInRow
-
row
-
familyMap
-
localBuffer
-
PAD_WIDTH
- See Also:
-
EMPTY_RESULT
-
INITIAL_CELLSCANNER_INDEX
- See Also:
-
cellScannerIndex
Index for where we are when Result is acting as aCellScanner
. -
stats
-
readonly
-
cursor
-
-
Constructor Details
-
Result
public Result()Creates an empty Result w/ no KeyValue payload; returns null if you callrawCells()
. Use this to represent no results ifnull
won't do or in old 'mapred' as opposed to 'mapreduce' package MapReduce where you need to overwrite a Result instance with acopyFrom(Result)
call. -
Result
Allows to construct special purpose immutable Result objects, such as EMPTY_RESULT.- Parameters:
readonly
- whether this Result instance is readonly
-
Result
-
Result
Private ctor. Usecreate(Cell[])
.
-
-
Method Details
-
create
Instantiate a Result with the specified List of KeyValues.
Note: You must ensure that the keyvalues are already sorted.- Parameters:
cells
- List of cells
-
create
-
create
-
create
-
create
Instantiate a Result with the specified array of KeyValues.
Note: You must ensure that the keyvalues are already sorted.- Parameters:
cells
- array of cells
-
create
-
create
-
create
-
create
-
create
static Result create(ExtendedCell[] cells, Boolean exists, boolean stale, boolean mayHaveMoreCellsInRow) -
createCursorResult
-
getRow
Method for retrieving the row key that corresponds to the row from which this Result was created. -
rawCells
Return the array of Cells backing this Result instance. The array is sorted from smallest -> largest using theCellComparator
. The array only contains what your Get or Scan specifies and no more. For example if you request column "A" 1 version you will have at most 1 Cell in the array. If you request column "A" with 2 version you will have at most 2 Cells, with the first one being the newer timestamp and the second being the older timestamp (this is the sort order defined byCellComparator
). If columns don't exist, they won't be present in the result. Therefore if you ask for 1 version all columns, it is safe to iterate over this array and expect to see 1 Cell for each column and no more. This API is faster than using getFamilyMap() and getMap()- Returns:
- array of Cells; can be null if nothing in the result
-
rawExtendedCells
-
listCells
Create a sorted list of the Cell's in this result. Since HBase 0.20.5 this is equivalent to raw().- Returns:
- sorted List of Cells; can be null if no cells in the result
-
getColumnCells
Return the Cells for the specific column. The Cells are sorted in theCellComparator
order. That implies the first entry in the list is the most recent column. If the query (Scan or Get) only requested 1 version the list will contain at most 1 entry. If the column did not exist in the result set (either the column does not exist or the column was not selected in the query) the list will be empty. Also see getColumnLatest which returns just a Cell- Parameters:
family
- the family- Returns:
- a list of Cells for this column or empty list if the column did not exist in the result set
-
notNullBytes
-
binarySearch
-
binarySearch
private int binarySearch(Cell[] kvs, byte[] family, int foffset, int flength, byte[] qualifier, int qoffset, int qlength) Searches for the latest value for the specified column.- Parameters:
kvs
- the array to searchfamily
- family namefoffset
- family offsetflength
- family lengthqualifier
- column qualifierqoffset
- qualifier offsetqlength
- qualifier length- Returns:
- the index where the value was found, or -1 otherwise
-
getColumnLatestCell
The Cell for the most recent timestamp for a given column.- Returns:
- the Cell for the column, or null if no value exists in the row or none have been selected in the query (Get/Scan)
-
getColumnLatestCell
public Cell getColumnLatestCell(byte[] family, int foffset, int flength, byte[] qualifier, int qoffset, int qlength) The Cell for the most recent timestamp for a given column.- Parameters:
family
- family namefoffset
- family offsetflength
- family lengthqualifier
- column qualifierqoffset
- qualifier offsetqlength
- qualifier length- Returns:
- the Cell for the column, or null if no value exists in the row or none have been selected in the query (Get/Scan)
-
getValue
Get the latest version of the specified column. Note: this call clones the value content of the hosting Cell. SeegetValueAsByteBuffer(byte[], byte[])
, etc., orlistCells()
if you would avoid the cloning.- Parameters:
family
- family namequalifier
- column qualifier- Returns:
- value of latest version of column, null if none found
-
getValueAsByteBuffer
Returns the value wrapped in a newByteBuffer
.- Parameters:
family
- family namequalifier
- column qualifier- Returns:
- the latest version of the column, or
null
if none found
-
getValueAsByteBuffer
public ByteBuffer getValueAsByteBuffer(byte[] family, int foffset, int flength, byte[] qualifier, int qoffset, int qlength) Returns the value wrapped in a newByteBuffer
.- Parameters:
family
- family namefoffset
- family offsetflength
- family lengthqualifier
- column qualifierqoffset
- qualifier offsetqlength
- qualifier length- Returns:
- the latest version of the column, or
null
if none found
-
loadValue
public boolean loadValue(byte[] family, byte[] qualifier, ByteBuffer dst) throws BufferOverflowException Loads the latest version of the specified column into the providedByteBuffer
.Does not clear or flip the buffer.
- Parameters:
family
- family namequalifier
- column qualifierdst
- the buffer where to write the value- Returns:
true
if a value was found,false
otherwise- Throws:
BufferOverflowException
- there is insufficient space remaining in the buffer
-
loadValue
public boolean loadValue(byte[] family, int foffset, int flength, byte[] qualifier, int qoffset, int qlength, ByteBuffer dst) throws BufferOverflowException Loads the latest version of the specified column into the providedByteBuffer
.Does not clear or flip the buffer.
- Parameters:
family
- family namefoffset
- family offsetflength
- family lengthqualifier
- column qualifierqoffset
- qualifier offsetqlength
- qualifier lengthdst
- the buffer where to write the value- Returns:
true
if a value was found,false
otherwise- Throws:
BufferOverflowException
- there is insufficient space remaining in the buffer
-
containsNonEmptyColumn
Checks if the specified column contains a non-empty value (not a zero-length byte array).- Parameters:
family
- family namequalifier
- column qualifier- Returns:
- whether or not a latest value exists and is not empty
-
containsNonEmptyColumn
public boolean containsNonEmptyColumn(byte[] family, int foffset, int flength, byte[] qualifier, int qoffset, int qlength) Checks if the specified column contains a non-empty value (not a zero-length byte array).- Parameters:
family
- family namefoffset
- family offsetflength
- family lengthqualifier
- column qualifierqoffset
- qualifier offsetqlength
- qualifier length- Returns:
- whether or not a latest value exists and is not empty
-
containsEmptyColumn
Checks if the specified column contains an empty value (a zero-length byte array).- Parameters:
family
- family namequalifier
- column qualifier- Returns:
- whether or not a latest value exists and is empty
-
containsEmptyColumn
public boolean containsEmptyColumn(byte[] family, int foffset, int flength, byte[] qualifier, int qoffset, int qlength) Checks if the specified column contains an empty value (a zero-length byte array).- Parameters:
family
- family namefoffset
- family offsetflength
- family lengthqualifier
- column qualifierqoffset
- qualifier offsetqlength
- qualifier length- Returns:
- whether or not a latest value exists and is empty
-
containsColumn
Checks for existence of a value for the specified column (empty or not).- Parameters:
family
- family namequalifier
- column qualifier- Returns:
- true if at least one value exists in the result, false if not
-
containsColumn
public boolean containsColumn(byte[] family, int foffset, int flength, byte[] qualifier, int qoffset, int qlength) Checks for existence of a value for the specified column (empty or not).- Parameters:
family
- family namefoffset
- family offsetflength
- family lengthqualifier
- column qualifierqoffset
- qualifier offsetqlength
- qualifier length- Returns:
- true if at least one value exists in the result, false if not
-
getMap
Map of families to all versions of its qualifiers and values.Returns a three level Map of the form:
Map&family,Map<qualifier,Map<timestamp,value>>>
Note: All other map returning methods make use of this map internally.
- Returns:
- map from families to qualifiers to versions
-
getNoVersionMap
Map of families to their most recent qualifiers and values.Returns a two level Map of the form:
Map&family,Map<qualifier,value>>
The most recent version of each qualifier will be used.
- Returns:
- map from families to qualifiers and value
-
getFamilyMap
Map of qualifiers to values.Returns a Map of the form:
Map<qualifier,value>
- Parameters:
family
- column family to get- Returns:
- map of qualifiers to values
-
value
Returns the value of the first column in the Result.- Returns:
- value of the first column
-
isEmpty
Check if the underlying Cell [] is empty or not- Returns:
- true if empty
-
size
Returns the size of the underlying Cell [] -
toString
-
compareResults
Does a deep comparison of two Results, down to the byte arrays.- Parameters:
res1
- first result to compareres2
- second result to compare- Throws:
Exception
- Every difference is throwing an exception
-
compareResults
Does a deep comparison of two Results, down to the byte arrays.- Parameters:
res1
- first result to compareres2
- second result to compareverbose
- includes string representation for all cells in the exception if true; otherwise include rowkey only- Throws:
Exception
- Every difference is throwing an exception
-
createCompleteResult
Forms a single result from the partial results in the partialResults list. This method is useful for reconstructing partial results on the client side.- Parameters:
partialResults
- list of partial results- Returns:
- The complete result that is formed by combining all of the partial results together
- Throws:
IOException
- A complete result cannot be formed because the results in the partial list come from different rows
-
getTotalSizeOfCells
Get total size of raw cells- Returns:
- Total size.
-
copyFrom
Copy another Result into this one. Needed for the old Mapred framework- Throws:
UnsupportedOperationException
- if invoked on instance of EMPTY_RESULT (which is supposed to be immutable).
-
cellScanner
For client users: You should only use the return value as aCellScanner
,ExtendedCellScanner
is marked as IA.Private which means there is no guarantee about its API stability.- Specified by:
cellScanner
in interfaceCellScannable
- Specified by:
cellScanner
in interfaceExtendedCellScannable
-
current
For client users: You should only use the return value as aCell
,ExtendedCell
is marked as IA.Private which means there is no guarantee about its API stability.- Specified by:
current
in interfaceCellScanner
- Specified by:
current
in interfaceExtendedCellScanner
-
advance
Description copied from interface:CellScanner
Advance the scanner 1 cell.- Specified by:
advance
in interfaceCellScanner
- Returns:
- true if the next cell is found and
CellScanner.current()
will return a valid Cell
-
getExists
-
setExists
-
isStale
Whether or not the results are coming from possibly stale data. Stale results might be returned ifConsistency
is not STRONG for the query.- Returns:
- Whether or not the results are coming from possibly stale data.
-
mayHaveMoreCellsInRow
For scanning large rows, the RS may choose to return the cells chunk by chunk to prevent OOM or timeout. This flag is used to tell you if the current Result is the last one of the current row. False means this Result is the last one. True means there MAY be more cells belonging to the current row. If you don't useScan.setAllowPartialResults(boolean)
orScan.setBatch(int)
, this method will always return false because the Result must contains all cells in one Row. -
setStatistics
Set load information about the region to the information about the result- Parameters:
loadStats
- statistics about the current region from which this was returned
-
getStats
Returns the associated statistics about the region from which this was returned. Can be null if stats are disabled. -
checkReadonly
All methods modifying state of Result object must call this method to ensure that special purpose immutable Results can't be accidentally modified. -
isCursor
Return true if this Result is a cursor to tell users where the server has scanned. In this Result the only meaningful method isgetCursor()
.while (r = scanner.next() && r != null) { if(r.isCursor()){ // scanning is not end, it is a cursor, save its row key and close scanner if you want, or // just continue the loop to call next(). } else { // just like before } } // scanning is end
Scan.setNeedCursorResult(boolean)
Cursor
getCursor()
-
getCursor
Return the cursor if this Result is a cursor result.Scan.setNeedCursorResult(boolean)
Cursor
isCursor()
-