Hadoop 配置单元无法识别hbase中的数字类型值

Hadoop 配置单元无法识别hbase中的数字类型值,hadoop,client,integration,hbase,hive,Hadoop,Client,Integration,Hbase,Hive,我有一个hive/hbase集成表,定义如下 create table user_c(user_id int, c_name string, c_kind string, c_industry string, c_jobtitle string, c_workyear int, c_title string, c_company string) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPE

我有一个hive/hbase集成表,定义如下

create table user_c(user_id int, c_name string, c_kind string, c_industry string,
c_jobtitle string, c_workyear int, c_title string, c_company string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:c_name,cf1:c_kind,cf1:c_industry,cf1:c_jobtitle,cf1:c_workyear,cf1:c_title,cf1:c_company")
TBLPROPERTIES ("hbase.table.name" = "user_c");
在java代码中,我创建了一个
Put
,并用从db读取的值填充它。代码如下所示:

final Put to = new Put(getByte(from, keyColumn));
for (final IColumn column : table.getColumns()) {
    if (column.equals(keyColumn)) continue;
    to.add(Bytes.toBytes(column.getColumnFamily()), Bytes.toBytes(column.getDestName()), getByte(from, column));
}
return to;
getByte
是一种将值转换为
byte[]
的方法。 看起来像

byte[] getByte(final Map<String, Object> map, IColumn column) {
    final Object val = map.get(column.getName());
    if (val instanceof Integer) {
        return Bytes.toBytes((Integer) val);
    }
    ...
}
行键是一种
Integer
类型,当通过
getByte
方法处理时,应自动将其取消装箱为primitive
int
类型。不仅行键,还有其他数字类型的列(cf1:c_workyear)显示为
\x00\x0A\x07\x0D
,一个字节数组

同时,
String
type列(cf1:c_industry)仅显示其值

这样行吗

当我从配置单元查询记录时,它只给我一个
NULL
,而不是number-type列的值

hive> select c_industry, c_workyear from user_c limit 1;
Total MapReduce CPU Time Spent: 10 seconds 370 msec
OK
120     NULL
Time taken: 46.063 seconds
hive似乎无法识别c_workyear值。我想这是因为那种类型不正确。但是
int
字节数组不应该存储为
int
值而不是字节数组吗

有人知道如何解决这个问题吗


非常感谢。

在表定义中尝试此选项

"hbase.columns.mapping" = ":key,cf1:c_name,cf1:c_kind,cf1:c_industry#b,cf1:c_jobtitle,cf1:c_workyear#b,cf1:c_title,cf1:c_company"

注意在二进制字段后面使用了
#b
。我们已经成功地使用它相当长一段时间了

我们遇到了同样的问题,并且通过使用列内映射参数中的#b解决了它-(“hbase.columns.mapping”=”:key,C1:Name,C1:marks#b)

列“marks”存储为bytearray,这是实际的长类型


@更为罕见的是,以字符串类型存储所有字段将不是一个有效的解决方案。

非常感谢您,我将尝试此方法。我现在的解决方案是,将所有字段设置为
string
type,它也可以工作。
"hbase.columns.mapping" = ":key,cf1:c_name,cf1:c_kind,cf1:c_industry#b,cf1:c_jobtitle,cf1:c_workyear#b,cf1:c_title,cf1:c_company"