Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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_Database Scan - Fatal编程技术网

HBase:如果行键存储为字节数组值,如何使用行键范围获取行

HBase:如果行键存储为字节数组值,如何使用行键范围获取行,hbase,database-scan,Hbase,Database Scan,我们使用HBase存储从oracle到hdfs的数据。这里我们将行键设计为字节数组值。行键由组合键构成,如(Md5(架构名称).getBytes()+Md5(日期(格式=yyyy-mm-dd)).getBytes()+ByteBuffer.allocate(8).putLong(pkid.array())。这里PKID是一个长值 如果我想获取特定模式和特定日期的所有行,我可以使用startrow和endrow查询hbase表,或者使用任何其他类似的方式进行查询 当我将行键存储为字符串时,如use

我们使用HBase存储从oracle到hdfs的数据。这里我们将行键设计为字节数组值。行键由组合键构成,如
(Md5(架构名称).getBytes()+Md5(日期(格式=yyyy-mm-dd)).getBytes()+ByteBuffer.allocate(8).putLong(pkid.array())
。这里PKID是一个长值

如果我想获取特定模式和特定日期的所有行,我可以使用startrow和endrow查询hbase表,或者使用任何其他类似的方式进行查询

当我将行键存储为字符串时,如
user1\u 20130123
user1\u 20130127
我可以使用

scan 'TempTable', {
    COLUMNS => ['CF:NAME'],
    LIMIT => 10,
    STARTROW => 'user1_20100101',
    ENDROW => 'user1_20100115'
}

在这里,我得到了user1在这些日期中的行。当我像上面那样存储行键时,我如何查询?

您的行键有问题,如果您散列日期,您将无法将其用作扫描的开始/停止行

您的行键应该如下所示:

[16B_schema_MD5_hash][8B_long_timestamp][8B_pkid]
Scan myScan = new Scan( 
    Bytes.add(Bytes.toBytes(schemaNameMD5Hash), Bytes.toBytes(startTimestamp)),
    Bytes.add(Bytes.toBytes(schemaNameMD5Hash), Bytes.toBytes(stopTimestamp))
);
您可以这样查询:

[16B_schema_MD5_hash][8B_long_timestamp][8B_pkid]
Scan myScan = new Scan( 
    Bytes.add(Bytes.toBytes(schemaNameMD5Hash), Bytes.toBytes(startTimestamp)),
    Bytes.add(Bytes.toBytes(schemaNameMD5Hash), Bytes.toBytes(stopTimestamp))
);

好的,我知道了,所以如果我将行键存储为[16B_schema_MD5_hash][yyyymmdd][8B_pkid],那么我就可以查询了,我使用行键测试了相同的值,即“user1_20130101”。如果我错了,请纠正我。当然,你可以这样做,因为特定格式的日期排序正确。请记住,您将获得相同的32字节键(yyyymmdd是一个8字节的字符串),但精度要低得多(天数而不是毫秒)。当我们使用哈希值和字符串、long(字符串的转换字节数组、long的转换字节数组)值组合存储行键时,是否会出现性能问题。也就是说,在这种行键设计中,从HBase表中查询记录将是一个性能问题?不,不会,HBase行键只是字节数组,不管您使用什么类型的数据来生成它们。请注意,我们配置的拆分不是十六进制的,它们是字符,这样,任何以“b”(\x62十六进制)开头的行都将进入“b”区域,或“1”(\x31十六进制)以下的任何行将被发送到“0”区域,这就是为什么所有内容都将发送到第一个区域。我建议您更新脚本,使第一个字节是代表十六进制值[0-9a-f]的ASCII字符(或更新拆分以使用单字节十六进制)。请看以下内容: