Si no tiene requisitos sobre el orden de los resultados de la consulta, puede utilizar la función de escaneo paralelo para obtenerlos de manera eficiente.
Requisitos previos
Se inicializó una instancia de OTSClient. Para más información, consulte Initialize an OTSClient instance.
Se creó una tabla de datos y se escribieron datos en ella. Para más información, consulte Create data tables y Write data.
Se creó un índice de búsqueda para la tabla de datos. Para más información, consulte Create search indexes.
Parámetros
Un escaneo paralelo requiere dos operaciones de coordinación: llame a ComputeSplits para obtener el ID de sesión y el número máximo de tareas paralelas (MaxParallel), y luego inicie una tarea ParallelScan por cada espacio paralelo, cada una con un CurrentParallelId único que va desde 0 hasta MaxParallel - 1. Por ejemplo, si MaxParallel es 4, inicie cuatro tareas de escaneo con valores de CurrentParallelId de 0, 1, 2 y 3 para cubrir el conjunto de datos completo.
|
Parámetro |
Descripción |
|
|
TableName |
El nombre de la tabla de datos. |
|
|
IndexName |
El nombre del índice de búsqueda. |
|
|
ScanQuery |
Query |
La condición de consulta. Tipos compatibles: consulta de término, consulta difusa, consulta de rango, consulta geográfica y consulta anidada; los mismos tipos que admite la operación Search. |
|
Limit |
El número máximo de filas devueltas por cada llamada a ParallelScan. |
|
|
MaxParallel |
El número máximo de tareas de escaneo paralelo por solicitud. El valor máximo depende del volumen de datos; los conjuntos de datos más grandes admiten más tareas paralelas. Llame a ComputeSplits para obtener este valor antes de iniciar un escaneo. Cada solicitud de ParallelScan utiliza un CurrentParallelId en el rango [0, MaxParallel), y se deben cubrir todos los ID de ese rango para escanear el conjunto de datos completo. Por ejemplo, si MaxParallel es 4, inicie cuatro tareas con valores de CurrentParallelId de 0, 1, 2 y 3. MaxParallel y CurrentParallelId deben usarse juntos. |
|
|
CurrentParallelId |
El ID de esta tarea de escaneo paralelo. Valores válidos: [0, MaxParallel). Cada tarea concurrente debe usar un ID único. Debe usarse junto con MaxParallel. |
|
|
Token |
El token de paginación para obtener la siguiente página de resultados. Cada respuesta de ParallelScan incluye un token para la siguiente página. Páselo en la solicitud posterior para continuar la lectura. Cuando el token es nulo, se han recuperado todos los datos de esta tarea. |
|
|
AliveTime |
El periodo de validez de la sesión y su token asociado, en segundos. Valor predeterminado: 60. Utilice el valor predeterminado. Si no se envía ninguna solicitud dentro del periodo de validez, la sesión caduca y no se pueden recuperar más datos. El periodo de validez se restablece con cada solicitud. Nota
Las sesiones pueden caducar antes de tiempo si se modifica dinámicamente el esquema del índice de búsqueda, falla un servidor individual o se realiza un balanceo de carga del servidor. En estos casos, vuelva a crear la sesión. |
|
|
ColumnsToGet |
Las columnas que se devolverán. Establezca el parámetro Columns para especificar los nombres de las columnas. Para devolver todas las columnas del índice de búsqueda, establezca ReturnAllFromIndex en true. Importante
El parámetro ReturnAll no es compatible. |
|
|
SessionId |
El ID de sesión para el escaneo paralelo. Llame a ComputeSplits para crear una sesión y obtener tanto el ID de sesión como el número máximo de tareas paralelas compatibles (MaxParallel). |
|
Ejemplo
A continuación se muestra un ejemplo que escanea todos los datos mediante un solo hilo. Llama a ComputeSplits para obtener el ID de sesión y MaxParallel, y luego recorre las páginas de resultados mediante NextToken hasta que se recuperan todas las filas.
/// <summary>
/// Scans all data in a search index using a single thread.
/// Calls ComputeSplits to get the session ID and MaxParallel,
/// then pages through results until NextToken is null.
/// </summary>
public class ParallelScan
{
public static void ParallelScanwithSingleThread(OTSClient otsClient)
{
SearchIndexSplitsOptions options = new SearchIndexSplitsOptions
{
IndexName = IndexName
};
ComputeSplitsRequest computeSplitsRequest = new ComputeSplitsRequest
{
TableName = TableName,
SplitOptions = options
};
ComputeSplitsResponse computeSplitsResponse = otsClient.ComputeSplits(computeSplitsRequest);
MatchAllQuery matchAllQuery = new MatchAllQuery();
ScanQuery scanQuery = new ScanQuery();
scanQuery.AliveTime = 60;
scanQuery.Query = matchAllQuery;
scanQuery.MaxParallel = computeSplitsResponse.SplitsSize;
scanQuery.Limit = 10;
ParallelScanRequest parallelScanRequest = new ParallelScanRequest();
parallelScanRequest.TableName = TableName;
parallelScanRequest.IndexName = IndexName;
parallelScanRequest.ScanQuery = scanQuery;
parallelScanRequest.ColumnToGet = new ColumnsToGet { ReturnAllFromIndex = true };
parallelScanRequest.SessionId = computeSplitsResponse.SessionId;
int total = 0;
List<Row> result = new List<Row>();
ParallelScanResponse parallelScanResponse = otsClient.ParallelScan(parallelScanRequest);
while (parallelScanResponse.NextToken != null)
{
List<Row> rows = new List<Row>(parallelScanResponse.Rows);
total += rows.Count;
result.AddRange(rows);
parallelScanRequest.ScanQuery.Token = parallelScanResponse.NextToken;
parallelScanResponse = otsClient.ParallelScan(parallelScanRequest);
}
foreach (Row row in result)
{
Console.WriteLine(JsonConvert.SerializeObject(row));
}
Console.WriteLine("Total Row Count: {0}", total);
}
}