根据 HBase文档,再次参考 Google BigTable 论文,据说这些行是使用行键的字典排序存储的。
很明显,当我们在 rowkey 中有一个字符串或者我们将一个字符串转换为字节数组并存储它时,这些行是按字典顺序排序的。事实上,即使您将整数转换为字符串然后转换为字节数组,这也是有意义的。 例如:下面的 hbase shell 将数字作为字符串并存储它
create 'test', 'cf'
put 'test', '1', 'cf:c1', 'xyz1'
put 'test', '2', 'cf:c1', 'xyz2'
put 'test', '11', 'cf:c1', 'xyz11'
scan 'test3'
ROW COLUMN+CELL
1 column=cf:c1, timestamp=1589736288540, value=xyz1
11 column=cf:c1, timestamp=1589736311607, value=xyz11
2 column=cf:c1, timestamp=1589736301167, value=xyz2
3 row(s) in 0.0080 seconds
另一方面,我可以使用 HBase 客户端实用程序以编程方式将数字转换为字节数组(org.apache.hadoop.hbase.util.Bytes
,它使用 Big Endian 的东西..),我看到行是自然排序的,而不是按字典的方式。对于上面类似的数据和表格,我使用下面的代码将数据放入 HBase 表。
val put = new Put(Bytes.toBytes(11L))
put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("c1"), Bytes.toBytes("abc"))
table.put(put)
扫描结果是
hbase(main):014:0> scan 'test2'
ROW COLUMN+CELL
\x01 column=cf:a, timestamp=1589727058289, value=abc \\1
\x02 column=cf:a, timestamp=1589727099714, value=abc \\2
\x0B column=cf:a, timestamp=1589727147449, value=abc \\11
{ column=cf:a, timestamp=1589733907127, value=abc \\123
\xF8 column=cf:a, timestamp=1589733854179, value=abc \\112312312L
5 row(s) in 0.0080 seconds
我的问题是 -
从整数生成的字节数组的字典顺序是否与自然顺序相同,或者我们将长字节数组转换为字节数组的方式实际上是填充一些值以获得有效的自然顺序,这纯属巧合?
如果不是,为了处理非类型化的行键,我们是说行键是按字典顺序排序的,这样当你与字符串等数据类型混合匹配时,排序有一个预定的顺序?在后一种情况下,在我看来,行键按严格的字典顺序排序是不正确的,因为只是为了满足我们对非类型列(此处为行键)的需求,它是这样构建的......!
基本上,这里的字节编码 -> Bytes.toBytes(long) 是否保留了的自然顺序Long
?也就是说,Array[Byte]
函数返回的字典顺序是否与作为输入的自然顺序相同Long
?