HBase中每行的不同列?

时间:2019-02-21 09:14:30

标签: hadoop time-series hbase

在我的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

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

  

扫描'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 值时,我正在为此运行查询;

  

扫描'tb',{STARTROW =>'1-1040s2',ENDROW =>'1-1044',FILTER =>“ RowFilter(=,'substring:s2')”}

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

1 个答案:

答案 0 :(得分:2)

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关联的值的最快方法,但对于其他查询可能不是最快的方法。