Определение внешней таблицы 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