Определение внешней таблицы Hive поверх существующей таблицы HBase

Существует пустая таблица 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");

Теперь ошибка, которую я получаю, это:

СБОЙ: Ошибка выполнения, код возврата 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 ответ

Решение

В вашем отображении, вы ссылаетесь на id поле, но вы должны ссылаться на HBase key ключевое слово. Как указано в документации:

запись сопоставления должна быть либо: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");

Сопоставление столбцов основано на порядке расположения столбцов, а не на их именах. В документации, параграфе " Несколько столбцов и семей", вы можете ясно видеть, что имена не имеют значения

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

Отображение тогда

  • ключ -> идентификатор
  • a: b -> значение1
  • a: c -> value2
  • d: e -> value3
Другие вопросы по тегам