在 HBase 现有表之上定义 Hive 外部表

Den*_*nis 2 hbase hive hcatalog

有一个空的HBase表,有两个列族:

create 'emp', 'personal_data', 'professional_data'
Run Code Online (Sandbox Code Playgroud)

现在我尝试将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");
Run Code Online (Sandbox Code Playgroud)

现在我得到的错误是这样的:

FAILED:执行错误,从 org.apache.hadoop.hive.ql.exec.DDLTask 返回代码 1。java.lang.RuntimeException: MetaException(message:org.apache.hadoop.hive.serde2.SerDeException org.apache.hadoop.hive.hbase.HBaseSerDe: columns 有 5 个元素,而 hbase.columns.mapping 有 6 个元素(计算键如果隐式))

你能帮我一下吗?难道我做错了什么?

che*_*aux 5

在映射中,您引用该id字段,但应引用 HBasekey关键字。如文档中所述:

映射条目必须是 :key 或以下形式:column-family-name:[column-name][#(binary|string)

只需替换: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");
Run Code Online (Sandbox Code Playgroud)

列映射基于列的顺序,而不是它们的名称。在文档的“多列和族”段落中,您可以清楚地看到名称并不重要

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"
)
Run Code Online (Sandbox Code Playgroud)

那么映射就是

  • 密钥 -> id
  • a:b -> 值 1
  • a:c -> 值2
  • d:e -> 值3