有一个空的 HBase 表,其中包含两个列系列:
create 'emp', 'personal_data', 'professional_data'
现在我正在尝试将 Hive 外部表映射到它,这自然会有一些列:
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");
现在我得到的错误是:
你可以帮帮我吗?我做错了吗?FAILED:执行错误,返回代码1 org.apache.hadoop.hive.ql.exec.DDLTask。了java.lang.RuntimeException: MetaException(消息:org.apache.hadoop.hive.serde2.SerDeException org.apache.hadoop.hive.hbase.HBaseSerDe:columns有5个元素 hbase.columns.mapping有6个元素(如果隐含则计算键))
答案 0 :(得分:3)
在您的映射中,您引用了id
字段,但您应该引用HBase key
关键字。如documentation中所述:
映射条目必须是: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"
)
然后是映射