HBase 乱码问题解决方法(通过java api 插入数据)

HBase 提供了 java 的api,可以很方便的通过 java 代码创建 table, 添加数据,删除数据等。

其中添加数据的代码如下:

package com.hbase.apidemo;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

public class InsertData {
    public static void main(String[] args) throws IOException {
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", "10.18.218.17:2181,10.18.218.5:2181,10.18.218.9:2181");

        Connection conn = ConnectionFactory.createConnection(conf);
        Table table = conn.getTable(TableName.valueOf("demo"));

        Put p = new Put(Bytes.toBytes("1"));

        p.addColumn(Bytes.toBytes("info"),Bytes.toBytes("name"),Bytes.toBytes("alice"));
        p.addColumn(Bytes.toBytes("info"),Bytes.toBytes("age"),Bytes.toBytes("15"));

        table.put(p);
        System.out.println("data inserted");

        table.close();
    }
}

此时,可以正常添加数据,在 HBase 中的数据如下:

其中 ROW = 1 的数据是通过代码添加的。

可以看出,此时添加数据是正常的,但有时我们在添加数据时,会出现乱码,比如下图:

HBase 乱码问题解决方法(通过java api 插入数据)_第1张图片

其中的 value 无法正常读取,通常出现这种情况的原因是在插入数据时,字符转换出现问题。添加一个字段的数据是通过 addColumn函数。它的三个参数分别是 列族、列、值,都是 Bytes 数组。当通过 Bytes.toBytes() 进行转换时,如果是一个 int 或 double,则转换后会出现乱码。

int 型数据转换:

HBase 乱码问题解决方法(通过java api 插入数据)_第2张图片

结果如下:

HBase 乱码问题解决方法(通过java api 插入数据)_第3张图片

从中可以看出,直接把 int 型的参数传入 Bytes.toBytes() 函数中,编译不会报错,但数据的格式发生错误,再显示时就会出现乱码,因此,在调用 Bytes.toBytes() 函数时,需要先将 int, double 型数据转换成 String 类型,此时即可正常显示。

在添加 int, double 类型数据时,需使用下面的方式:

int a = 80;
double b = 110.23;
p.addColumn(Bytes.toBytes("info"),Bytes.toBytes("a"),Bytes.toBytes(String.valueOf(a)));
p.addColumn(Bytes.toBytes("info"),Bytes.toBytes("b"),Bytes.toBytes(String.valueOf(b)));

此时,HBase 中的数据即可正常显示:

HBase 乱码问题解决方法(通过java api 插入数据)_第4张图片

你可能感兴趣的:(HBase)