Estoy usando el siguiente código para obtener los datos de BigQuery.
public class BQTEST { public static void main(String... args) throws Exception { String datasetName = "mydataset"; String tableName = "mytable"; String projectId = "gcs"; String query = "SELECT id, " + "qtr, " + "sales, " + "year " + "FROM `gcs.mydataset.mytable` " + ; BigQuery bigquery = BigQueryOptions.newBuilder().setProjectId(projectId) .setCredentials( ServiceAccountCredentials.fromStream(new FileInputStream("20a3c78f8388.json")) ) .build().getService(); TableId tableId = TableId.of(projectId, datasetName, tableName); QueryJobConfiguration queryConfig = QueryJobConfiguration .newBuilder(query) .build(); try { bigquery.query(queryConfig); } catch (InterruptedException e) { e.printStackTrace(); throw new RuntimeException(e.getMessage()); } TableResult results = bigquery.listTableData( tableId, BigQuery.TableDataListOption.pageSize(1), BigQuery.TableDataListOption.startIndex(5) ); for (FieldValueList row : results.iterateAll()) { System.out.printf( "ID: %s qtr: %s sales: %s year: %s\n", row.get(0).getValue(), row.get(1).getValue(), row.get(2).getValue(), row.get(3).getValue()); } } } BigQuery.TableDataListOption.startIndex(5) : esto ayudará a leer datos del quinto índice, el índice comienza desde 0.
Pero quiero leer datos en fragmentos como los primeros 10 registros en un proceso, luego los siguientes 20 registros en otro proceso, etc.
Intentando leer datos de una tabla muy grande en un proceso paralelo. Es una tabla Truncar/Cargar. Así que no hay particiones ni rango de fechas para leer datos.
No puedo encontrar una manera de dar el valor LAST_INDEX en ninguno de los métodos de BigQuery.
¿Alguien podría ayudar con esto?
No hay un método LAST_INDEX que pueda usar para la paginación, como puede verificar en la documentación .
Acerca de su solicitud:
Quiero leer datos en fragmentos como los primeros 10 registros en un proceso, luego los siguientes 20 registros en otro proceso, etc.
Al usar python, puede usar algunos parámetros como max_results y start_index para realizarlo, pero en Java, la única forma será paginar su consulta y cambiarla para cada proceso. Entonces, para cada proceso en paralelo, tendrá una consulta diferente.
Entonces, cada proceso tendrá que:
limit y offset :es decir:
String query = "SELECT id, qtr, sales, year FROM `gcs.mydataset.mytable` " + "ORDER BY id, qtr, sales, year " + "LIMIT 10 " + "OFFSET " + String.valueOf(process_number * 10) ; El proceso 0 tendrá líneas 0-9 (límite 10 desplazamiento 0);
El proceso 1 tendrá las líneas 10-19 (límite 10 compensación 10)