2012-01-12 58 views
7

與HBase的Java API的工作,當值的數據類型,我有如下一行代碼:的Java(HBase的)API:如何知道存儲字節

byte[] value = scanner.next().getValue(Bytes.toBytes(family), Bytes.toBytes(qualifier)); 

假設我不知道這個值是Int還是String類型,,應該使用Byte.toInt(value)Byte.toString(value)之間的值來正確打印值

這不是一個真正的HBase/Hadoop問題,而是一個Java問題,但是我用Google搜索並找不到獲取它的方法。有可能知道嗎?

另一方面,從HBase Java API中,我怎麼知道存儲在family:qualifier中的給定值的數據類型?

謝謝!

回答

3

對於你的第一個問題,你可以嘗試轉換爲int,如果你有一個異常,你知道它是一個字符串。但這不是一個好方法。

+4

1一個例子:該一面是,某些32位'int'值也是有效的字符串。 – 2012-01-12 11:52:17

5

與傳統的RDBMS不同,HBase不支持「類型列」,數據存儲區會跟蹤所存儲數據的類型。 HBase本身並沒有跟蹤 - 所以沒有辦法本地告訴 - 存儲在列中的數據的類型。使用HBase的開發人員負責自行跟蹤列數據類型。

對於許多應用程序,應用程序可以對每列的類型進行「硬編碼」。通過這種方式,HBase表往往比RDBMS表更適用於特定應用程序。開發人員還可以創建專用於行的數據類型模式的列族或列(例如,將Avro模式序列化爲字符串)。

HBase的文檔的「建築」的網頁介紹HBase的和傳統的RDBMS略偏這裏之間的區別:

https://hbase.apache.org/book/architecture.html#arch.overview.when

0

使用OrderedBytes而存儲的值。這確保了每種類型的數據前綴有一些數字值。 參考,https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/util/OrderedBytes.html

byte[] value = scanner.next().getValue(Bytes.toBytes(family), Bytes.toBytes(qualifier)); 
int typeByte = value[0] 
if(typeByte == 52) 
    // do operation for String 
else if(typeByte == 43) 
    // do operation for Integer 
else if (typeByte == 45) 
    // do operation for Double 

注:值43,45和52,同時將數據寫入到HBase的按數據類型被追加。

參見在http://davidgreenshtein.blogspot.co.uk/2015/03/geo-spatial-search-in-hbase.html

+1

在解答當前問題時添加一些解釋以及回答如何解答此問題的答案 – 2016-12-26 18:49:02

+0

在答案中加入此答案。 – 2016-12-26 19:42:46

相關問題