gpt4 book ai didi

hadoop - HBase 中每一行的不同列?

转载 作者:可可西里 更新时间:2023-11-01 14:30:13 25 4
gpt4 key购买 nike

在我的 HBase 表中,每一行的列可能与其他行不同。例如;

ROW                       COLUMN
1-1040 cf:s1
1-1040 cf:s2
1-1043 cf:s2
2-1040 cf:s5
2-1045 cf:s99
3-1040 cf:s75
3-1042 cf:s135

如上所示,每一行的列都与其他行不同。所以,当我像这样运行扫描查询时;

scan 'tb', {COLUMNS=>'cf:s2', STARTROW=>'1-1040', ENDROW=>'1-1044'}

我想使用上述查询获取 cf:s2 值。但是,是否会因为每一行都有不同的列而出现性能问题?

另一种选择;

ROW                       COLUMN
1-1040-s1 cf:value
1-1040-s2 cf:value
1-1043-s2 cf:value
2-1040-s5 cf:value
2-1045-s99 cf:value
3-1040-s75 cf:value
3-1042-s135 cf:value

在这个选项中,当我想获得介于 1-1040 和 1-1044 之间的 s2 值时,我为此运行此查询;

scan 'tb', {STARTROW=>'1-1040s2', ENDROW=>'1-1044', FILTER=>"RowFilter(=, 'substring:s2')"}

当我想获取s2值时,哪个选项在读取性能上更好?

最佳答案

HBase 将给定列族的所有记录存储在同一个文件中,因此即使您应用过滤器,扫描也必须遍历所有键值对。您建议的两种数据存储方式都是如此。

为了获得此特定扫描的最佳性能,您应该考虑将 s2 数据存储在不同的列族中。在底层,HBase 将以下列方式存储您的数据:

一个文件:

1-1040                    cf1:s1
2-1040 cf1:s5
2-1045 cf1:s99
3-1040 cf1:s75
3-1042 cf1:s135

另一个文件:

1-1040                    cf2:s2
1-1043 cf2:s2

然后您可以只对 cf2 进行扫描,HBase 将只读取包含 s2 的数据,从而使操作更快。

scan 'tb', {COLUMNS => 'cf2', STARTROW=>'1-1040s2', ENDROW=>'1-1044'}

注意事项:

  • 建议每个表只包含两个或三个列族,因此如果您想为 s5s75 等运行此查询,则不应实现此操作。在这种情况下,您的复合行键选项更好,因为 HBase 只需要查看行键,而不是列限定符。
  • 这取决于您要运行哪些查询,以及运行它们的频率。这是您获取与 s2 关联的值的最快方法,但对于其他查询可能不是最快的。

关于hadoop - HBase 中每一行的不同列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54803258/

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