Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HBase行键和范围扫描_Hbase - Fatal编程技术网

HBase行键和范围扫描

HBase行键和范围扫描,hbase,Hbase,我有一个像20110103这样的行键模式,所以行键会像20110103-1-23-333 例如,当我使用扫描进行范围查询时, startRow->20110103-1-23- endRow->20110105-1-23- 我得到的行也不在上述范围内。例如,我也得到了行20110105-1-15-6666。我也得到了与商店15相关的行 我怎样才能解决这个问题??RegularExpressionFilter会解决此问题吗 请就这个问题提供建议……在您列出的三行键中: 20110103-1-23-

我有一个像20110103这样的行键模式,所以行键会像20110103-1-23-333

例如,当我使用扫描进行范围查询时, startRow->20110103-1-23- endRow->20110105-1-23-

我得到的行也不在上述范围内。例如,我也得到了行20110105-1-15-6666。我也得到了与商店15相关的行

我怎样才能解决这个问题??RegularExpressionFilter会解决此问题吗


请就这个问题提供建议……

在您列出的三行键中:

20110103-1-23-
20110105-1-15-666
20110105-1-23-
在我看来,这是自然的排序顺序;以“666”结尾的一个确实在以“20110103”开头的一个之后


(有一点可能会让人困惑,对HBase来说,这些都只是字节,字典排序一次只进行一个字节;因此,“aaa”将在“aa”之后但在“ab”之前进行排序。

第20110105-1-15-6666行正确地在这个范围内[20110103-1-23-,20110105-1-23-),因为15小于23,并且行的排序是字典式的。

您提到“我也在获取与store 15相关的行”,这让我想到行键中的第三个数字(
\uuuuuuuuuuuuuuuuuuuuuu23-
)是该行的某种属性

我建议更改此表的模式,将此“存储编号”设为一列,以便您的键看起来像
20110103-1
,并且在“存储”列中,您有这些编号
15
23
或其他任何内容

这样,在扫描中,可以过滤掉列存储=15的行

如果您使用的是Java API,这将类似于:

SingleColumnValueFilter filter = new SingleColumnValueFilter(
   Bytes.toBytes("columnfamily"),
   Bytes.toBytes("storenumber"),
   CompareFilter.CompareOp.NOT_EQUAL,
   Bytes.toBytes(15)
);
filter.setFilterIfMissing(true);
Scan scan = new Scan(
   Bytes.toBytes("20110103-1"),
   Bytes.toBytes("20110105-1")
);
scan.setFilter(filter);

您可能在行键中存储了太多的数据,请尝试在行键中获取其中一些属性并将它们设置为列。同时请记住,您也可以使用日期(我假设
20110105
是日期)作为时间戳(表的单元格)而不是行键。这取决于您的应用程序。

您可以通过以下命令打开hbase外壳

scan 'YourHbaseTableName',{FILTER=>"(RowFilter(=,'regexstring:20110103'))"}

假设HBase是字节的多嵌套有序映射。 因此,您需要将时间戳保存在二进制表示中,以便在每个查询中获得正确的顺序

我认为您可以使用字符串数据类型保存rowkey值,例如使用java方法:

yourDateString.getBytes(encoding) 

由HBase API添加

我的建议是将时间值保存为时间戳(long)。 该长度应序列化为字节,然后保存在rowkey中。 请注意,在rowkey中保存时间戳有点问题,因为时间戳会不断上升。时间戳会随着每毫秒的增加而变大,因此每个新值都会保存到管理此区域的HBase区域。因此,简单地说,您只需向其中一台群集计算机写入数据,而这不是使用HBase群集的目标。 对于大小为100机器的集群,可以使用satting(在rowkey前面放置一个随机数,将所有值分布到整个集群)。 看看这个项目。 它可以为您透明地执行序列化、salt等操作,提供简单的类似SQL的语句

Bytes.toBytes(yourDateString)