gpt4 book ai didi

hbase - 为什么说 HBase 行按字典顺序存储?

转载 作者:行者123 更新时间:2023-12-05 02:54:19 26 4
gpt4 key购买 nike

基于HBase documentation ,再次遵循 Google BigTable 论文的引用,据说这些行是按行键的字典顺序存储的。

很明显,当我们在 rowkey 中有一个字符串或者如果我们将一个字符串转换为字节数组并存储它时,行是按字典顺序排序的。事实上,即使您将整数转换为字符串,然后再转换为字节数组,这也是有意义的。例如:下面的 hbase shell 将数字作为字符串存储起来<​​/p>

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 Table。

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

我的问题是 -
从整数生成的字节数组的字典顺序与自然顺序相同是纯属巧合还是我们将 long 转换为字节数组的方式实际上是用一些值填充以获得有效的自然排序?
如果不是,为了处理非类型行键,我们是说行键按字典顺序排序,以便在与字符串和其他数据类型混合匹配时,排序具有预定顺序?在后一种情况下,在我看来,行键严格按照字典顺序排序是不正确的,因为只是为了满足我们拥有非类型化列(这里是行键)的需要,它是这样构建的......!

基本上,这里是字节编码-> Bytes.toBytes(long)保留 Long 的自然顺序?也就是说,函数返回的Array[Byte]的字典序与作为输入的Long的自然排序是一样的吗?

最佳答案

您的问题的答案是肯定的。但是,如果您混合使用不同的 key 大小,请小心。例如,如果您使用相同大小的所有键,并且所有键都是用 Bytes.toBytes(long) 生成的,它们将保持自然的长顺序。如果您混合使用不同大小的字节数组,情况就不会如此,因为如您所示,例如,一个字节“1”将围绕两个字节“11”。

对于toBytes(),它使用固定长度的大端编码。假设您使用四个字节,那么顺序将是这样的:

00 00 00 00 (long value 0)
00 00 00 01 (long value 1)
00 00 00 02
...
00 00 01 00 (long value 256)
...

这将在自然数和 key 生成中进行相同的排序。

关于hbase - 为什么说 HBase 行按字典顺序存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61856190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com