Hive 在HBase现有表之上定义配置单元外部表
有一个空的HBase表,有两个列族:Hive 在HBase现有表之上定义配置单元外部表,hive,hbase,hcatalog,Hive,Hbase,Hcatalog,有一个空的HBase表,有两个列族: create 'emp', 'personal_data', 'professional_data' 现在我正在尝试将一个配置单元外部表映射到它,它自然会有一些列: CREATE EXTERNAL TABLE emp(id int, city string, name string, occupation string, salary int) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHan
create 'emp', 'personal_data', 'professional_data'
现在我正在尝试将一个配置单元外部表映射到它,它自然会有一些列:
CREATE EXTERNAL TABLE emp(id int, city string, name string, occupation string, salary int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":id,
personal_data:city,
personal_data:name,
professional_data:occupation,
professional_data:salary")
TBLPROPERTIES ("hbase.table.name" = "emp", "hbase.mapred.output.outputtable" = "emp");
现在我得到的错误是:
失败:执行错误,从返回代码1
org.apache.hadoop.hive.ql.exec.ddlstask。java.lang.RuntimeException:
MetaException(消息:org.apache.hadoop.hive.serde2.SerDeException
org.apache.hadoop.hive.hbase.hbaseserd:列有5个元素,而
hbase.columns.mapping有6个元素(如果是隐式的,则计键))
你能帮我一下吗?我做错了什么吗?在映射中,您引用的是
id
字段,但您应该引用HBase键
关键字。如合同所述:
映射项必须为:key或形式
列族名称:[列名称][#(二进制|字符串)
只需将:id
替换为:key
,即可:
CREATE EXTERNAL TABLE emp(id int, city string, name string, occupation string, salary int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,
personal_data:city,
personal_data:name,
professional_data:occupation,
professional_data:salary")
TBLPROPERTIES ("hbase.table.name" = "emp", "hbase.mapred.output.outputtable" = "emp");
列映射基于列的顺序,而不是它们的名称。在文档中的段落“多列和族”中,您可以清楚地看到名称并不重要
CREATE TABLE hbase_table_1(key int, value1 string, value2 int, value3 int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" = ":key,a:b,a:c,d:e"
)
然后,映射就开始了
- 键->id
- a:b->value1
- a:c->value2
- d:e->value3