2016-10-12 41 views
1

有一個空HBase的表有兩個列族:對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.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:執行錯誤,從 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 has 5 elements while hbase.columns.mapping has 6 elements(計數的關鍵如果隱含))

你能幫我嗎?難道我做錯了什麼?

回答

2

在您的映射中,您引用了id字段,但您應該引用HBase key關鍵字。正如documentation說:

映射條目必須是:鍵或形式的 列家族的名字:[列名] [#(二進制|字符串)

剛通過:key更換:id和應該這樣做:

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 - >數值2
  • d:電子 - > VALUE3
+0

但是,它會將Hive id列映射到Hbase密鑰?或者我出錯了?謝謝你的回答:) – Dennis

+0

是的,我重新閱讀了幾次文檔,它讓我非常困惑。非常感謝cheseaux!它完美的作品。祝你有美好的一天。 – Dennis