...
Info | ||
---|---|---|
| ||
Avro Data Stored in HBase ColumnsAs of Hive 0.9.0 the HBase integration requires at least HBase 0.92, earlier versions of Hive were working with HBase 0.89/0.90 |
...
The hbase.columns.mapping
property is required and will be explained in the next section. The hbase.table.name
property is optional; it controls the name of the table as known by HBase, and allows the Hive table to have a different name. In this example, the table is known as hbase_table_1
within Hive, and as xyz
within HBase. If not specified, then the Hive and HBase and HBase table names will be identical. The hbaseThe hbase.mapred.output.outputtable
property is property is optional; it's needed if you plan to insert data to the table (the property is used by hbaseby hbase.mapreduce.TableOutputFormat
)
After executing the command above, you should be able to see the new (empty) table in the HBase shell:
...
No Format |
---|
CREATE EXTERNAL TABLE hbase_table_2(key int, value string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = "cf1:val")
TBLPROPERTIES("hbase.table.name" = "some_existing_table", "hbase.mapred.output.outputtable" = "some_existing_table");
|
Again, hbase.columns.mapping
is required (and will be validated against the existing HBase table's column families), whereas hbase.table.name
is optional. The hbase.mapred.output.outputtable
is optional.
Column Mapping
There are two SERDEPROPERTIES
that control the mapping of HBase columns to Hive:
...
- for each Hive column, the table creator must specify a corresponding entry in the comma-delimited
hbase.columns.mapping
string (so for a Hive table with n columns, the string should have n entries); whitespace should not be used in between entries since these will be interperted as part of the column name, which is almost certainly not what you want - a mapping entry must be either
:key
,:timestamp
or of the formcolumn-family-name:[column-name][#(binary|string)
(the type specification that delimited by # was added in Hive 0.9.0, earlier versions interpreted everything as strings)- If no type specification is given the value from
hbase.table.default.storage.type
will be used - Any prefixes of the valid values are valid too (i.e.
#b
instead of#binary
) - If you specify a column as
binary
the bytes in the corresponding HBase cells are expected to be of the form that HBase'sBytes
class yields.
- If no type specification is given the value from
- there must be exactly one
:key
mapping (this can be mapped either to a string or struct column–see Simple Composite Keys and Complex Composite Keys) - (note that before HIVE-1228 in Hive 0.6,
:key
was not supported, and the first Hive column implicitly mapped to the key; as of Hive 0.6, it is now strongly recommended that you always specify the key explictly; we will drop support for implicit key mapping in the future) - if no column-name is given, then the Hive column will map to all columns in the corresponding HBase column family, and the Hive MAP datatype must be used to allow access to these (possibly sparse) columns
- there is currently no way to access the HBase timestamp attribute, and queries always access data with the latest timestamp.
- Since HBase does not associate datatype information with columns, the serde converts everything to string representation before storing it in HBase; there is currently no way to plug in a custom serde per columnSince HBase 1.1 (HBASE-2828) there is a way to access the HBase timestamp attribute using the special
:timestamp
mapping. It needs to be eitherbigint
ortimestamp
. - it is not necessary to reference every HBase column family, but those that are not mapped will be inaccessible via the Hive table; it's possible to map multiple Hive tables to the same HBase table
...
Code Block |
---|
-- Parse a row key with 3 fixed width fields each of width 10 -- Example taken from: https://svn.apache.org/repos/asf/hive/trunk/hbase-handler/src/test/queries/positive/hbase_custom_key2.q CREATE TABLE hbase_ck_4(key struct<col1:string,col2:string,col3:string>, value string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( "hbase.table.name" = "hbase_custom2", "hbase.mapred.output.outputtable" = "hbase_custom2", "hbase.columns.mapping" = ":key,cf:string", "hbase.composite.key.factory"="org.apache.hadoop.hive.hbase.SampleHBaseKeyFactory2"); |
"hbase.composite.key.factory" should be the fully qualified class name of a class implementing HBaseKeyFactory. See SampleHBaseKeyFactory2 for a fixed length example in the same package. This class must be on your classpath in order for the above example to work. TODO: place these in an accessible place; they're currently only in test code.
Avro Data Stored in HBase Columns
Info |
---|
As of Hive 0.14.0 with HIVE-6147 |
...
Code Block |
---|
CREATE EXTERNAL TABLE test_hbase_avro ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe' STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( "hbase.columns.mapping" = ":key,test_col_fam:test_col", "test_col_fam.test_col.serialization.type" = "avro", "test_col_fam.test_col.avro.schema.url" = "hdfs://testcluster/tmp/schema.avsc") TBLPROPERTIES ( "hbase.table.name" = "hbase_avro_table", "hbase.mapred.output.outputtable" = "hbase_avro_table", "hbase.struct.autogenerate"="true"); |
...