扫描所有记录
ScanResult scanAll(ScanRequest request)
功能
扫描操作,每个扫描过的记录消耗1个读配额(即使不满足过滤条件),每个Lazy二级索引需要1个额外读配额
方法参数
request : ScanRequest : required
ScanRequest包括以下部分
1.tableName : String : required
指定扫描的表名
2.indexName :String : optional
指定扫描的二级索引名,如果不指定,即扫描主记录
3.startKey : Map< String, Datum > :optional
查询范围开始,包含startKey,如果startKey不是完整键,而是部分key的前缀,则实际查询的startKey为{startKey, 最小可能的后缀}补全形式
4.stopKey : Map< String, Datum > :optional
查询范围结束,不包含stopKey,如果stopKey不是完整键,而是部分key的前缀,则实际查询的stopKey为{stopKey, 最大可能的后缀}补全形式
5.attributes : List< String > :optional
需要返回的属性列表,不指定表示返回所有属性
6.condition : String : optional
类SQL WHERE语句的查询条件。 注意:与SQL不同,此条件仅作为过滤条件,不影响具体查询计划(index, startKey, endKey),进行范围查询时需要显示设置index和startKey以及endKey。每个扫描的记录均计入读配额,即使不满足查询条件。尽量避免使用条件过滤,尤其是当过滤掉的记录占一半以上时,强烈不建议使用。
7.limit :int : optinal
返回记录的数目限制,如果满足条件的记录有limit条或更多,则一定会返回limit数量的记录,即使quota不足。limit 默认为10
8.reverse : boolean : optional
是否进行逆序扫描,进行逆序扫描时startKey应大于endKey
注意:逆序查询效率较低,谨慎使用,建议设置对应的Key为逆序存储
9.inGlobalOrder :boolean :optional
是否全局有序扫描,对于设置了实体组键且开启了哈希的表,需要设置该值为true才能保证结果有序
10.action :ScanAction : optional
scan时的连带操作,包括COUNT,DELETE和UPDATE, 类似SQL的select count(*) / update XXX / delete XXX from table where XXX 语义
方法返回值
scanResult : ScanResult
scanResult包括以下内容
1.records : List< Map< String,Datum > >
扫描到的记录
2.nextStartKey : Map< String,Datum >
下一个需要扫描的记录主键,NULL表示达到制定的结束位置
异常错误码
INTERNAL_ERROR(1) : 服务器异常
ACCESS_DENIED(4) : 用户对该表没有读权限
VALIDATION_FAILED(5): 参数设置错误
THROUGHPUT_EXCEED(8): 当前读写速度已超过该表的读写配额
RESOURCE_NOT_FOUND(9) : 所指定的表不存在
限制
limit 值的最大限制和每个集群的配置有关
注意
scan在quota不足的情况,返回的记录数可能会小于limit
scanAll则会内部多次进行rpc调用,直到nextStartKey为null或者达到limit限制
scanAll耗时较长,调用此接口建议将client超时时间调到较大值
示例
以示例表为例,下面给出扫描记录的示例代码
$scan = new ScanRequest(array(
"tableName" => $tableName,
"indexName" => "mtime",
"startKey" => array(
"userId" => DatumUtil::datum("user1"),
),
"stopKey" => array(
"userId" => DatumUtil::datum("user1"),
),
"condition" => "title REGEXP '.*[0-5]' AND noteId > 5",
"attributes" => array("noteId", "title", "mtime"),
"limit" => 20000 // 返回的记录条数限制
));
$tableClient->scanAll($scan);