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 的數據是通過代碼添加的。

可以看出,此時添加數據是正常的,但有時我們在添加數據時,會出現亂碼,比如下圖:

其中的 value 無法正常讀取,通常出現這種情況的原因是在插入數據時,字符轉換出現問題。添加一個字段的數據是通過 addColumn函數。它的三個參數分別是 列族、列、值,都是 Bytes 數組。當通過 Bytes.toBytes() 進行轉換時,如果是一個 int 或 double,則轉換後會出現亂碼。

int 型數據轉換:

結果如下:

從中可以看出,直接把 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 中的數據即可正常顯示:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章