在HBase现有表的顶部定义Hive外部表

时间:2016-10-12 08:20:12

标签: hive hbase hcatalog

有一个空的 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个元素(如果隐含则计算键))

你可以帮帮我吗?我做错了吗?

1 个答案:

答案 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"
)

然后是映射

  • key - > ID
  • a:b - >值1
  • a:c - >值2
  • d:e - > value3
相关问题