HBase 中每一行的不同列?
Different Columns for Each Row in HBase?
在我的 HBase table 中,每一行的列可能与其他行不同。例如;
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'}
注意事项:
- 建议每个 table 只包含两个或三个列族,因此如果您想 运行 此查询
s5
,[=17],则不应实施此操作=] 等。在这种情况下,您的复合行键选项更好,因为 HBase 只需要查看行键,而不是列限定符。
- 这完全取决于您要 运行 查询哪些查询,以及您将 运行 查询它们的频率。这是您获取与
s2
关联的值的最快方法,但对于其他查询可能不是最快的方法。
在我的 HBase table 中,每一行的列可能与其他行不同。例如;
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'}
注意事项:
- 建议每个 table 只包含两个或三个列族,因此如果您想 运行 此查询
s5
,[=17],则不应实施此操作=] 等。在这种情况下,您的复合行键选项更好,因为 HBase 只需要查看行键,而不是列限定符。 - 这完全取决于您要 运行 查询哪些查询,以及您将 运行 查询它们的频率。这是您获取与
s2
关联的值的最快方法,但对于其他查询可能不是最快的方法。