org.apache.pig.backend.hadoop.hbase
Class HBaseStorage

java.lang.Object
  extended by org.apache.pig.LoadFunc
      extended by org.apache.pig.backend.hadoop.hbase.HBaseStorage
All Implemented Interfaces:
LoadPushDown, OrderedLoadFunc, StoreFuncInterface

public class HBaseStorage
extends LoadFunc
implements StoreFuncInterface, LoadPushDown, OrderedLoadFunc

A HBase implementation of LoadFunc and StoreFunc.

Below is an example showing how to load data from HBase:

raw = LOAD 'hbase://SampleTable'
       USING org.apache.pig.backend.hadoop.hbase.HBaseStorage(
       'info:first_name info:last_name friends:* info:*', '-loadKey true -limit 5')
       AS (id:bytearray, first_name:chararray, last_name:chararray, friends_map:map[], info_map:map[]);
 
This example loads data redundantly from the info column family just to illustrate usage. Note that the row key is inserted first in the result schema. To load only column names that start with a given prefix, specify the column name with a trailing '*'. For example passing friends:bob_* to the constructor in the above example would cause only columns that start with bob_ to be loaded.

Below is an example showing how to store data into HBase:

copy = STORE raw INTO 'hbase://SampleTableCopy'
       USING org.apache.pig.backend.hadoop.hbase.HBaseStorage(
       'info:first_name info:last_name friends:* info:*')
       AS (info:first_name info:last_name buddies:* info:*);
 
Note that STORE will expect the first value in the tuple to be the row key. Scalars values need to map to an explicit column descriptor and maps need to map to a column family name. In the above examples, the friends column family data from SampleTable will be written to a buddies column family in the SampleTableCopy table.


Nested Class Summary
 
Nested classes/interfaces inherited from interface org.apache.pig.LoadPushDown
LoadPushDown.OperatorSet, LoadPushDown.RequiredField, LoadPushDown.RequiredFieldList, LoadPushDown.RequiredFieldResponse
 
Field Summary
protected  byte[] gt_
           
protected  byte[] gte_
           
protected  byte[] lt_
           
protected  byte[] lte_
           
 
Constructor Summary
HBaseStorage(String columnList)
          Constructor.
HBaseStorage(String columnList, String optString)
          Constructor.
 
Method Summary
 void checkSchema(ResourceSchema s)
          Set the schema for data to be stored.
 void cleanupOnFailure(String location, org.apache.hadoop.mapreduce.Job job)
          This method will be called by Pig if the job which contains this store fails.
 List<LoadPushDown.OperatorSet> getFeatures()
          Determine the operators that can be pushed to the loader.
 org.apache.hadoop.mapreduce.InputFormat getInputFormat()
          This will be called during planning on the front end.
 LoadCaster getLoadCaster()
          Set up the caster to use for reading values out of, and writing to, HBase.
 Tuple getNext()
          Retrieves the next tuple to be processed.
 org.apache.hadoop.mapreduce.OutputFormat getOutputFormat()
          Return the OutputFormat associated with StoreFuncInterface.
 org.apache.hadoop.io.WritableComparable<org.apache.hadoop.mapreduce.InputSplit> getSplitComparable(org.apache.hadoop.mapreduce.InputSplit split)
          The WritableComparable object returned will be used to compare the position of different splits in an ordered stream
 void prepareToRead(org.apache.hadoop.mapreduce.RecordReader reader, PigSplit split)
          Initializes LoadFunc for reading data.
 void prepareToWrite(org.apache.hadoop.mapreduce.RecordWriter writer)
          Initialize StoreFuncInterface to write data.
 LoadPushDown.RequiredFieldResponse pushProjection(LoadPushDown.RequiredFieldList requiredFieldList)
          Indicate to the loader fields that will be needed.
 void putNext(Tuple t)
          Write a tuple to the data store.
 String relativeToAbsolutePath(String location, org.apache.hadoop.fs.Path curDir)
          This method is called by the Pig runtime in the front end to convert the input location to an absolute path if the location is relative.
 String relToAbsPathForStoreLocation(String location, org.apache.hadoop.fs.Path curDir)
          This method is called by the Pig runtime in the front end to convert the output location to an absolute path if the location is relative.
 void setLocation(String location, org.apache.hadoop.mapreduce.Job job)
          Communicate to the loader the location of the object(s) being loaded.
 void setStoreFuncUDFContextSignature(String signature)
          This method will be called by Pig both in the front end and back end to pass a unique signature to the StoreFuncInterface which it can use to store information in the UDFContext which it needs to store between various method invocations in the front end and back end.
 void setStoreLocation(String location, org.apache.hadoop.mapreduce.Job job)
          Communicate to the storer the location where the data needs to be stored.
 void setUDFContextSignature(String signature)
          This method will be called by Pig both in the front end and back end to pass a unique signature to the LoadFunc.
 
Methods inherited from class org.apache.pig.LoadFunc
getAbsolutePath, getPathStrings, join
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

gt_

protected transient byte[] gt_

gte_

protected transient byte[] gte_

lt_

protected transient byte[] lt_

lte_

protected transient byte[] lte_
Constructor Detail

HBaseStorage

public HBaseStorage(String columnList)
             throws org.apache.commons.cli.ParseException,
                    IOException
Constructor. Construct a HBase Table LoadFunc and StoreFunc to load or store the cells of the provided columns.

Parameters:
columnList - columnlist that is a presented string delimited by space. To retreive all columns in a column family Foo, specify a column as either Foo: or Foo:*. To fetch only columns in the CF that start with bar, specify Foo:bar*. The resulting tuple will always be the size of the number of tokens in columnList. Items in the tuple will be scalar values when a full column descriptor is specified, or a map of column descriptors to values when a column family is specified.
Throws:
org.apache.commons.cli.ParseException - when unale to parse arguments
IOException

HBaseStorage

public HBaseStorage(String columnList,
                    String optString)
             throws org.apache.commons.cli.ParseException,
                    IOException
Constructor. Construct a HBase Table LoadFunc and StoreFunc to load or store.

Parameters:
columnList -
optString - Loader options. Known options:
  • -loadKey=(true|false) Load the row key as the first column
  • -gt=minKeyVal
  • -lt=maxKeyVal
  • -gte=minKeyVal
  • -lte=maxKeyVal
  • -limit=numRowsPerRegion max number of rows to retrieve per region
  • -caching=numRows number of rows to cache (faster scans, more memory).
Throws:
org.apache.commons.cli.ParseException
IOException
Method Detail

getNext

public Tuple getNext()
              throws IOException
Description copied from class: LoadFunc
Retrieves the next tuple to be processed. Implementations should NOT reuse tuple objects (or inner member objects) they return across calls and should return a different tuple object in each call.

Specified by:
getNext in class LoadFunc
Returns:
the next tuple to be processed or null if there are no more tuples to be processed.
Throws:
IOException - if there is an exception while retrieving the next tuple

getInputFormat

public org.apache.hadoop.mapreduce.InputFormat getInputFormat()
Description copied from class: LoadFunc
This will be called during planning on the front end. This is the instance of InputFormat (rather than the class name) because the load function may need to instantiate the InputFormat in order to control how it is constructed.

Specified by:
getInputFormat in class LoadFunc
Returns:
the InputFormat associated with this loader.

prepareToRead

public void prepareToRead(org.apache.hadoop.mapreduce.RecordReader reader,
                          PigSplit split)
Description copied from class: LoadFunc
Initializes LoadFunc for reading data. This will be called during execution before any calls to getNext. The RecordReader needs to be passed here because it has been instantiated for a particular InputSplit.

Specified by:
prepareToRead in class LoadFunc
Parameters:
reader - RecordReader to be used by this instance of the LoadFunc
split - The input PigSplit to process

setUDFContextSignature

public void setUDFContextSignature(String signature)
Description copied from class: LoadFunc
This method will be called by Pig both in the front end and back end to pass a unique signature to the LoadFunc. The signature can be used to store into the UDFContext any information which the LoadFunc needs to store between various method invocations in the front end and back end. A use case is to store LoadPushDown.RequiredFieldList passed to it in LoadPushDown.pushProjection(RequiredFieldList) for use in the back end before returning tuples in LoadFunc.getNext(). This method will be call before other methods in LoadFunc

Overrides:
setUDFContextSignature in class LoadFunc
Parameters:
signature - a unique signature to identify this LoadFunc

setLocation

public void setLocation(String location,
                        org.apache.hadoop.mapreduce.Job job)
                 throws IOException
Description copied from class: LoadFunc
Communicate to the loader the location of the object(s) being loaded. The location string passed to the LoadFunc here is the return value of LoadFunc.relativeToAbsolutePath(String, Path). Implementations should use this method to communicate the location (and any other information) to its underlying InputFormat through the Job object. This method will be called in the backend multiple times. Implementations should bear in mind that this method is called multiple times and should ensure there are no inconsistent side effects due to the multiple calls.

Specified by:
setLocation in class LoadFunc
Parameters:
location - Location as returned by LoadFunc.relativeToAbsolutePath(String, Path)
job - the Job object store or retrieve earlier stored information from the UDFContext
Throws:
IOException - if the location is not valid.

relativeToAbsolutePath

public String relativeToAbsolutePath(String location,
                                     org.apache.hadoop.fs.Path curDir)
                              throws IOException
Description copied from class: LoadFunc
This method is called by the Pig runtime in the front end to convert the input location to an absolute path if the location is relative. The loadFunc implementation is free to choose how it converts a relative location to an absolute location since this may depend on what the location string represent (hdfs path or some other data source)

Overrides:
relativeToAbsolutePath in class LoadFunc
Parameters:
location - location as provided in the "load" statement of the script
curDir - the current working direction based on any "cd" statements in the script before the "load" statement. If there are no "cd" statements in the script, this would be the home directory -
/user/ 
Returns:
the absolute location based on the arguments passed
Throws:
IOException - if the conversion is not possible

getLoadCaster

public LoadCaster getLoadCaster()
                         throws IOException
Set up the caster to use for reading values out of, and writing to, HBase.

Overrides:
getLoadCaster in class LoadFunc
Returns:
the LoadCaster associated with this loader. Returning null indicates that casts from byte array are not supported for this loader. construction
Throws:
IOException - if there is an exception during LoadCaster

getOutputFormat

public org.apache.hadoop.mapreduce.OutputFormat getOutputFormat()
                                                         throws IOException
Description copied from interface: StoreFuncInterface
Return the OutputFormat associated with StoreFuncInterface. This will be called on the front end during planning and on the backend during execution.

Specified by:
getOutputFormat in interface StoreFuncInterface
Returns:
the OutputFormat associated with StoreFuncInterface
Throws:
IOException - if an exception occurs while constructing the OutputFormat

checkSchema

public void checkSchema(ResourceSchema s)
                 throws IOException
Description copied from interface: StoreFuncInterface
Set the schema for data to be stored. This will be called on the front end during planning if the store is associated with a schema. A Store function should implement this function to check that a given schema is acceptable to it. For example, it can check that the correct partition keys are included; a storage function to be written directly to an OutputFormat can make sure the schema will translate in a well defined way.

Specified by:
checkSchema in interface StoreFuncInterface
Parameters:
s - to be checked
Throws:
IOException - if this schema is not acceptable. It should include a detailed error message indicating what is wrong with the schema.

prepareToWrite

public void prepareToWrite(org.apache.hadoop.mapreduce.RecordWriter writer)
                    throws IOException
Description copied from interface: StoreFuncInterface
Initialize StoreFuncInterface to write data. This will be called during execution before the call to putNext.

Specified by:
prepareToWrite in interface StoreFuncInterface
Parameters:
writer - RecordWriter to use.
Throws:
IOException - if an exception occurs during initialization

putNext

public void putNext(Tuple t)
             throws IOException
Description copied from interface: StoreFuncInterface
Write a tuple to the data store.

Specified by:
putNext in interface StoreFuncInterface
Parameters:
t - the tuple to store.
Throws:
IOException - if an exception occurs during the write

relToAbsPathForStoreLocation

public String relToAbsPathForStoreLocation(String location,
                                           org.apache.hadoop.fs.Path curDir)
                                    throws IOException
Description copied from interface: StoreFuncInterface
This method is called by the Pig runtime in the front end to convert the output location to an absolute path if the location is relative. The StoreFuncInterface implementation is free to choose how it converts a relative location to an absolute location since this may depend on what the location string represent (hdfs path or some other data source). The static method LoadFunc.getAbsolutePath(java.lang.String, org.apache.hadoop.fs.Path) provides a default implementation for hdfs and hadoop local file system and it can be used to implement this method.

Specified by:
relToAbsPathForStoreLocation in interface StoreFuncInterface
Parameters:
location - location as provided in the "store" statement of the script
curDir - the current working direction based on any "cd" statements in the script before the "store" statement. If there are no "cd" statements in the script, this would be the home directory -
/user/ 
Returns:
the absolute location based on the arguments passed
Throws:
IOException - if the conversion is not possible

setStoreFuncUDFContextSignature

public void setStoreFuncUDFContextSignature(String signature)
Description copied from interface: StoreFuncInterface
This method will be called by Pig both in the front end and back end to pass a unique signature to the StoreFuncInterface which it can use to store information in the UDFContext which it needs to store between various method invocations in the front end and back end. This is necessary because in a Pig Latin script with multiple stores, the different instances of store functions need to be able to find their (and only their) data in the UDFContext object.

Specified by:
setStoreFuncUDFContextSignature in interface StoreFuncInterface
Parameters:
signature - a unique signature to identify this StoreFuncInterface

setStoreLocation

public void setStoreLocation(String location,
                             org.apache.hadoop.mapreduce.Job job)
                      throws IOException
Description copied from interface: StoreFuncInterface
Communicate to the storer the location where the data needs to be stored. The location string passed to the StoreFuncInterface here is the return value of StoreFuncInterface.relToAbsPathForStoreLocation(String, Path) This method will be called in the frontend and backend multiple times. Implementations should bear in mind that this method is called multiple times and should ensure there are no inconsistent side effects due to the multiple calls. StoreFuncInterface.checkSchema(ResourceSchema) will be called before any call to StoreFuncInterface.setStoreLocation(String, Job).

Specified by:
setStoreLocation in interface StoreFuncInterface
Parameters:
location - Location returned by StoreFuncInterface.relToAbsPathForStoreLocation(String, Path)
job - The Job object
Throws:
IOException - if the location is not valid.

cleanupOnFailure

public void cleanupOnFailure(String location,
                             org.apache.hadoop.mapreduce.Job job)
                      throws IOException
Description copied from interface: StoreFuncInterface
This method will be called by Pig if the job which contains this store fails. Implementations can clean up output locations in this method to ensure that no incorrect/incomplete results are left in the output location

Specified by:
cleanupOnFailure in interface StoreFuncInterface
Parameters:
location - Location returned by StoreFuncInterface.relToAbsPathForStoreLocation(String, Path)
job - The Job object - this should be used only to obtain cluster properties through JobContext.getConfiguration() and not to set/query any runtime job information.
Throws:
IOException

getFeatures

public List<LoadPushDown.OperatorSet> getFeatures()
Description copied from interface: LoadPushDown
Determine the operators that can be pushed to the loader. Note that by indicating a loader can accept a certain operator (such as selection) the loader is not promising that it can handle all selections. When it is passed the actual operators to push down it will still have a chance to reject them.

Specified by:
getFeatures in interface LoadPushDown
Returns:
list of all features that the loader can support

pushProjection

public LoadPushDown.RequiredFieldResponse pushProjection(LoadPushDown.RequiredFieldList requiredFieldList)
                                                  throws FrontendException
Description copied from interface: LoadPushDown
Indicate to the loader fields that will be needed. This can be useful for loaders that access data that is stored in a columnar format where indicating columns to be accessed a head of time will save scans. This method will not be invoked by the Pig runtime if all fields are required. So implementations should assume that if this method is not invoked, then all fields from the input are required. If the loader function cannot make use of this information, it is free to ignore it by returning an appropriate Response

Specified by:
pushProjection in interface LoadPushDown
Parameters:
requiredFieldList - RequiredFieldList indicating which columns will be needed. This structure is read only. User cannot make change to it inside pushProjection.
Returns:
Indicates which fields will be returned
Throws:
FrontendException

getSplitComparable

public org.apache.hadoop.io.WritableComparable<org.apache.hadoop.mapreduce.InputSplit> getSplitComparable(org.apache.hadoop.mapreduce.InputSplit split)
                                                                                                   throws IOException
Description copied from interface: OrderedLoadFunc
The WritableComparable object returned will be used to compare the position of different splits in an ordered stream

Specified by:
getSplitComparable in interface OrderedLoadFunc
Parameters:
split - An InputSplit from the InputFormat underlying this loader.
Returns:
WritableComparable representing the position of the split in input
Throws:
IOException


Copyright © ${year} The Apache Software Foundation