簡體   English   中英

HBase Java API寫長而不是十六進制值

[英]HBase java API to write long instead of Hexadecimal values

我正在使用Hbase Put API使用以下代碼將長數據類型寫入Hbase

p.add(Bytes.toBytes(this.hcol_fam_n), Bytes.toBytes(this.hcol_qual_n), Bytes.toBytes(this.newoffset));

當我在Hbase Shell上運行掃描命令時,值以二進制表示的十六進制格式顯示

value=\x00\x00\x00\x00\x00\x00\x00\x07

但是,當我從Hbase shell使用put語句時,它正確顯示為“ 7”。 為什么會有這種差異? 還有什么方法可以不使用Bytes.toBytes寫入Hbase而直接寫入值,以便可以從Hbase shell正確看到該值?

如果沒有其他方法可以在hbase shell中以可讀形式寫入值,那么如何在scan語句中為此列調用java Bytes.toString

當我使用Hbase GET API讀取相同的值時,無法使用Bytes.toString(value)將值從Bytes轉換為字符串

這給了我空字符串。 但是使用Bytes.toLong(value)將相同的值轉換為Long。

有人可以幫我理解為什么這不是轉換為字符串而是轉換為Long嗎?

HBase將所有值存儲為字節數組,並且不存儲有關數據類型的任何元數據,因此,當您輸入Long類型的值時,HBase會將值轉換為其字節表示形式,並將字節寫入單元格中。

當您在外殼中執行“掃描”時,它會盡力向您顯示數據,但它不知道數據的類型。 因此它將字節顯示為字符,但是如果字節是控制字符,它將顯示為十六進制表示,而不是在控制台中顯示垃圾。 而且,當您使用Bytes.toString獲取數據時,它也不知道單元格內包含哪種數據,而僅生成new String(bytes)

您有兩種選擇:

  • 在放入HBase之前將數據轉換為String: p.add(colFamily, qualifier, Bytes.toBytes(Long.toString(this.newoffset))); 並在讀取時從String轉換回Long。 這會增加每次讀/寫的開銷,並占用更多空間,但是您將所有數據都可讀在外殼中。
  • 直接像現在一樣放置Long值,然后使用Bytes.toLong讀回它。 這樣,您的數據通常會占用較少的空間(每個值總是8個字節,而不是最多20個字節),並且讀寫速度更快,但是您仍會在HBase Shell中看到它的十六進制表示形式。

處理此問題的最佳方法是將整數轉換為字符串,然后再將其存儲到hbase。我遇到了相同的問題,並按如下所示解決了這個問題:new String(data.toString).getBytes()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM