[英]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)
。
您有兩種選擇:
p.add(colFamily, qualifier, Bytes.toBytes(Long.toString(this.newoffset)));
並在讀取時從String轉換回Long。 這會增加每次讀/寫的開銷,並占用更多空間,但是您將所有數據都可讀在外殼中。 處理此問題的最佳方法是將整數轉換為字符串,然后再將其存儲到hbase。我遇到了相同的問題,並按如下所示解決了這個問題:new String(data.toString).getBytes()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.