當使用場景中不關心整個結果集的順序時,您可以使用并發導出數據功能以更快的速度將命中的數據全部返回。
前提條件
已初始化Client。具體操作,請參見初始化OTSClient。
已在數據表上創建多元索引。具體操作,請參見創建多元索引。
參數
參數 | 說明 | |
TableName | 數據表名稱。 | |
IndexName | 多元索引名稱。 | |
ScanQuery | Query | 多元索引的查詢語句。支持精確查詢、模糊查詢、范圍查詢、地理位置查詢、嵌套查詢等,功能和Search接口一致。 |
Limit | 掃描數據時一次能返回的數據行數。 | |
MaxParallel | 最大并發數。請求支持的最大并發數由用戶數據量決定。數據量越大,支持的并發數越多,每次任務前可以通過ComputeSplits API進行獲取。 | |
CurrentParallelID | 當前并發ID。取值范圍為[0, MaxParallel)。 | |
Token | 用于翻頁功能。ParallelScan請求結果中有下一次進行翻頁的Token,使用該Token可以接著上一次的結果繼續讀取數據。 | |
AliveTime | ParallelScan的當前任務有效時間,也是Token的有效時間。默認值為60,建議使用默認值,單位為秒。如果在有效時間內沒有發起下一次請求,則不能繼續讀取數據。持續發起請求會刷新Token有效時間。 說明 動態修改schema中的切換索引、服務端單臺機器故障、服務端負載均衡等均會導致Session提前過期,此時需要重新創建Session。 | |
ColumnsToGet | 指定分組結果中需要返回的列名,可以通過將列名加入Columns來實現。 如果需要返回多元索引中的所有列,則可以使用更簡潔的ReturnAllFromIndex實現。 重要 此處不能使用ReturnAll。 | |
SessionId | 本次并發掃描數據任務的SessionId。您可以通過ComputeSplits API創建Session,同時獲得本次任務支持的最大并發數。 |
示例
請根據實際選擇單并發掃描數據和多線程并發掃描數據。
單并發掃描數據
相對于多并發掃描數據,單并發掃描數據的代碼更簡單,單并發代碼無需關心currentParallelId和maxParallel參數。單并發使用方式的整體吞吐比Search接口方式高,但是比多線程多并發使用方式的吞吐低。
func computeSplits(client *tablestore.TableStoreClient, tableName string, indexName string) (*tablestore.ComputeSplitsResponse, error) {
req := &tablestore.ComputeSplitsRequest{}
req.
SetTableName(tableName).
SetSearchIndexSplitsOptions(tablestore.SearchIndexSplitsOptions{IndexName: indexName})
res, err := client.ComputeSplits(req)
if err != nil {
return nil, err
}
return res, nil
}
/**
* ParallelScan單并發掃描數據。
*/
func ParallelScanSingleConcurrency(client *tablestore.TableStoreClient, tableName string, indexName string) {
computeSplitsResp, err := computeSplits(client, tableName, indexName)
if err != nil {
fmt.Printf("%#v", err)
return
}
query := search.NewScanQuery().SetQuery(&search.MatchAllQuery{}).SetLimit(2)
req := &tablestore.ParallelScanRequest{}
req.SetTableName(tableName).
SetIndexName(indexName).
SetColumnsToGet(&tablestore.ColumnsToGet{ReturnAllFromIndex: false}).
SetScanQuery(query).
SetSessionId(computeSplitsResp.SessionId)
res, err := client.ParallelScan(req)
if err != nil {
fmt.Printf("%#v", err)
return
}
total := len(res.Rows)
for res.NextToken != nil {
req.SetScanQuery(query.SetToken(res.NextToken))
res, err = client.ParallelScan(req)
if err != nil {
fmt.Printf("%#v", err)
return
}
total += len(res.Rows) //process rows each loop
}
fmt.Println("total: ", total)
}
多線程并發掃描數據
func computeSplits(client *tablestore.TableStoreClient, tableName string, indexName string) (*tablestore.ComputeSplitsResponse, error) {
req := &tablestore.ComputeSplitsRequest{}
req.
SetTableName(tableName).
SetSearchIndexSplitsOptions(tablestore.SearchIndexSplitsOptions{IndexName: indexName})
res, err := client.ComputeSplits(req)
if err != nil {
return nil, err
}
return res, nil
}
/**
* ParallelScan多并發掃描數據。
*/
func ParallelScanMultiConcurrency(client *tablestore.TableStoreClient, tableName string, indexName string) {
computeSplitsResp, err := computeSplits(client, tableName, indexName)
if err != nil {
fmt.Printf("%#v", err)
return
}
var wg sync.WaitGroup
wg.Add(int(computeSplitsResp.SplitsSize))
for i := int32(0); i < computeSplitsResp.SplitsSize; i++ {
current := i
go func() {
defer wg.Done()
query := search.NewScanQuery().
SetQuery(&search.MatchAllQuery{}).
SetCurrentParallelID(current).
SetMaxParallel(computeSplitsResp.SplitsSize).
SetLimit(2)
req := &tablestore.ParallelScanRequest{}
req.SetTableName(tableName).
SetIndexName(indexName).
SetColumnsToGet(&tablestore.ColumnsToGet{ReturnAllFromIndex: false}).
SetScanQuery(query).
SetSessionId(computeSplitsResp.SessionId)
res, err := client.ParallelScan(req)
if err != nil {
fmt.Printf("%#v", err)
return
}
total := len(res.Rows)
for res.NextToken != nil {
req.SetScanQuery(query.SetToken(res.NextToken))
res, err = client.ParallelScan(req)
if err != nil {
fmt.Printf("%#v", err)
return
}
total += len(res.Rows) //process rows each loop
}
fmt.Println("total: ", total)
}()
}
wg.Wait()
}
常見問題
相關文檔
多元索引查詢類型包括精確查詢、多詞精確查詢、全匹配查詢、匹配查詢、短語匹配查詢、前綴查詢、范圍查詢、通配符查詢、多條件組合查詢、地理位置查詢、嵌套類型查詢、向量檢索和列存在性查詢,您可以選擇合適的查詢類型進行多維度數據查詢。
如果要對結果集進行排序或者翻頁,您可以使用排序和翻頁功能來實現。具體操作,請參見排序和翻頁。
如果要按照某一列對結果集做折疊,使對應類型的數據在結果展示中只出現一次,您可以使用折疊(去重)功能來實現。具體操作,請參見折疊(去重)。
如果要進行數據分析,例如求最值、求和、統計行數等,您可以使用Search接口的統計聚合功能或者SQL查詢來實現。具體操作,請參見統計聚合和SQL查詢。
如果要快速導出數據,而不關心整個結果集的順序時,您可以使用ParallelScan接口和ComputeSplits接口實現多并發導出數據。具體操作,請參見并發導出數據。