并發(fā)導(dǎo)出數(shù)據(jù)
當(dāng)使用場景中不關(guān)心整個結(jié)果集的順序時,您可以使用并發(fā)導(dǎo)出數(shù)據(jù)功能以更快的速度將命中的數(shù)據(jù)全部返回。
前提條件
已初始化Client。具體操作,請參見初始化Client。
已創(chuàng)建數(shù)據(jù)表并寫入數(shù)據(jù)。具體操作,請參見創(chuàng)建數(shù)據(jù)表和寫入數(shù)據(jù)。
已在數(shù)據(jù)表上創(chuàng)建多元索引。具體操作,請參見創(chuàng)建多元索引。
參數(shù)
參數(shù) | 說明 | |
tableName | 數(shù)據(jù)表名稱。 | |
indexName | 多元索引名稱。 | |
scanQuery | query | 多元索引的查詢語句。支持精確查詢、模糊查詢、范圍查詢、地理位置查詢、嵌套查詢等,功能和Search接口一致。 |
limit | 掃描數(shù)據(jù)時一次能返回的數(shù)據(jù)行數(shù)。 | |
maxParallel | 最大并發(fā)數(shù)。請求支持的最大并發(fā)數(shù)由用戶數(shù)據(jù)量決定。數(shù)據(jù)量越大,支持的并發(fā)數(shù)越多,每次任務(wù)前可以通過ComputeSplits API進(jìn)行獲取。 | |
currentParallelId | 當(dāng)前并發(fā)ID。取值范圍為[0, maxParallel)。 | |
token | 用于翻頁功能。ParallelScan請求結(jié)果中有下一次進(jìn)行翻頁的token,使用該token可以接著上一次的結(jié)果繼續(xù)讀取數(shù)據(jù)。 | |
aliveTime | ParallelScan的當(dāng)前任務(wù)有效時間,也是token的有效時間。默認(rèn)值為60,建議使用默認(rèn)值,單位為秒。如果在有效時間內(nèi)沒有發(fā)起下一次請求,則不能繼續(xù)讀取數(shù)據(jù)。持續(xù)發(fā)起請求會刷新token有效時間。 說明 動態(tài)修改schema中的切換索引、服務(wù)端單臺機(jī)器故障、服務(wù)端負(fù)載均衡等均會導(dǎo)致Session提前過期,此時需要重新創(chuàng)建Session。 | |
columnsToGet | 指定分組結(jié)果中需要返回的列名,可以通過將列名加入Columns來實現(xiàn)。 如果需要返回多元索引中的所有列,則可以使用更簡潔的ReturnAllFromIndex實現(xiàn)。 重要 此處不能使用ReturnAll。 | |
sessionId | 本次并發(fā)掃描數(shù)據(jù)任務(wù)的sessionId。創(chuàng)建Session可以通過ComputeSplits API來創(chuàng)建,同時獲得本次任務(wù)支持的最大并發(fā)數(shù)。 |
示例
以下示例用于并發(fā)導(dǎo)出數(shù)據(jù)。
//1.獲取sessionId。
let computeSplits = await new Promise((resolve, reject) => {
client.computeSplits({
tableName: tableName,
searchIndexSplitsOptions: {
indexName: indexName,
}
}, function (err, data) {
if (err) {
console.log('computeSplits error:', err.toString());
reject(err);
} else {
console.log('computeSplits success:', data);
resolve(data)
}
})
})
//2.構(gòu)造query。
const scanQuery = {
query: {
queryType: TableStore.QueryType.MATCH_ALL_QUERY,
},
limit: 1000,
aliveTime: 30,
token: undefined,
currentParallelId: 0,
maxParallel: 1,
}
//3.構(gòu)造ParallelScan請求(該示例為了方便介紹使用同步請求進(jìn)行展示,實際業(yè)務(wù)中可修改為異步)。
const parallelScanPromise = function () {
return new Promise(function (resolve, reject) {
client.parallelScan({
tableName: tableName,
indexName: indexName,
columnToGet: {
returnType: TableStore.ColumnReturnType.RETURN_ALL_FROM_INDEX,
},
sessionId: computeSplits.sessionId,
scanQuery: scanQuery,
}, function (err, data) {
if (err) {
console.log('parallelScan error:', err.toString());
reject(err);
} else {
console.log("parallelScan, rows:", data.rows.length)
resolve(data)
}
});
})
}
let totalCount = 0 //示例代碼記錄總行數(shù)。
let parallelScanResponse = await parallelScanPromise()
totalCount = totalCount + parallelScanResponse.rows.length
//4.迭代拉取數(shù)據(jù),直到拉取所有數(shù)據(jù)結(jié)束。
while (parallelScanResponse.nextToken !== null && parallelScanResponse.nextToken.length > 0) {
scanQuery.token = parallelScanResponse.nextToken
parallelScanResponse = await parallelScanPromise()
totalCount += parallelScanResponse.rows.length
}
console.log("total rows:", totalCount)
常見問題
相關(guān)文檔
多元索引查詢類型包括精確查詢、多詞精確查詢、全匹配查詢、匹配查詢、短語匹配查詢、前綴查詢、范圍查詢、通配符查詢、多條件組合查詢、地理位置查詢、嵌套類型查詢、向量檢索和列存在性查詢,您可以選擇合適的查詢類型進(jìn)行多維度數(shù)據(jù)查詢。
如果要對結(jié)果集進(jìn)行排序或者翻頁,您可以使用排序和翻頁功能來實現(xiàn)。具體操作,請參見排序和翻頁。
如果要按照某一列對結(jié)果集做折疊,使對應(yīng)類型的數(shù)據(jù)在結(jié)果展示中只出現(xiàn)一次,您可以使用折疊(去重)功能來實現(xiàn)。具體操作,請參見折疊(去重)。
如果要進(jìn)行數(shù)據(jù)分析,例如求最值、求和、統(tǒng)計行數(shù)等,您可以使用Search接口的統(tǒng)計聚合功能或者SQL查詢來實現(xiàn)。具體操作,請參見統(tǒng)計聚合和SQL查詢。
如果要快速導(dǎo)出數(shù)據(jù),而不關(guān)心整個結(jié)果集的順序時,您可以使用ParallelScan接口和ComputeSplits接口實現(xiàn)多并發(fā)導(dǎo)出數(shù)據(jù)。具體操作,請參見并發(fā)導(dǎo)出數(shù)據(jù)。