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

mwyxok5s  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(323)

我有一个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);
    }
    ...
}

然后放入hbase。
我可以从hbase shell扫描记录。

hbase(main):001:0> scan 'user_c'
ROW                                COLUMN+CELL                                                                                      
\x00\x0A\x07\x0D                  column=cf1:c_workyear, timestamp=1350298280554, value=\x00\x00\x07\xD8                         
\x00\x0A\x07\x0D                  column=cf1:c_industry, timestamp=1350298280554, value=120
...

行键是 Integer 类型,该类型应自动取消绑定到基元 int 由处理时键入 getByte 方法。不仅行键,其他数字类型列(cf1:c\u workyear)也显示为 \x00\x0A\x07\x0D ,字节数组。
同时 String 类型列(cf1:cïindustry)只显示它的值。
这样行吗?
当我从Hive中查询记录时,它只会给我一个 NULL 而不是数字类型列的值。

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\ U workyear值。我想是因为那种类型不对。但不应该 int 字节数组不能存储为 int 值,而不是字节数组?
有人知道怎么解决这个问题吗?
谢谢。

bkkx9g8r

bkkx9g8r1#

在表定义中尝试此操作

"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 在二进制字段之后。我们已经成功地使用了一段时间了

ttvkxqim

ttvkxqim2#

我们也遇到了同样的问题,通过使用#b in column mapping参数(hbase.columns.mapping“=”:key,c1:name,c1:marks#b)解决了这个问题
列“marks”存储为bytearray,这是实际的long类型。
@更为罕见的是,以字符串类型存储所有字段将不是一个有效的解决方案。

相关问题