private void setupBigQueryTable( String projectId, String datasetId, String tableId, TableSchema schema) throws IOException { if (bigQueryClient == null) { bigQueryClient = Transport.newBigQueryClient(options.as(BigQueryOptions.class)).build(); } Datasets datasetService = bigQueryClient.datasets(); if (executeNullIfNotFound(datasetService.get(projectId, datasetId)) == null) { Dataset newDataset = new Dataset() .setDatasetReference( new DatasetReference().setProjectId(projectId).setDatasetId(datasetId)); datasetService.insert(projectId, newDataset).execute(); } Tables tableService = bigQueryClient.tables(); Table table = executeNullIfNotFound(tableService.get(projectId, datasetId, tableId)); if (table == null) { Table newTable = new Table() .setSchema(schema) .setTableReference( new TableReference() .setProjectId(projectId) .setDatasetId(datasetId) .setTableId(tableId)); tableService.insert(projectId, datasetId, newTable).execute(); } else if (!table.getSchema().equals(schema)) { throw new RuntimeException( "Table exists and schemas do not match, expecting: " + schema.toPrettyString() + ", actual: " + table.getSchema().toPrettyString()); } }
/** * Retrieves or creates the table. * * <p>The table is checked to conform to insertion requirements as specified by WriteDisposition * and CreateDisposition. * * <p>If table truncation is requested (WriteDisposition.WRITE_TRUNCATE), then this will re-create * the table if necessary to ensure it is empty. * * <p>If an empty table is required (WriteDisposition.WRITE_EMPTY), then this will fail if the * table exists and is not empty. * * <p>When constructing a table, a {@code TableSchema} must be available. If a schema is provided, * then it will be used. If no schema is provided, but an existing table is being cleared * (WRITE_TRUNCATE option above), then the existing schema will be re-used. If no schema is * available, then an {@code IOException} is thrown. */ public Table getOrCreateTable( WriteDisposition writeDisposition, CreateDisposition createDisposition, @Nullable TableSchema schema) throws IOException { // Check if table already exists. Bigquery.Tables.Get get = client.tables().get(ref.getProjectId(), ref.getDatasetId(), ref.getTableId()); Table table = null; try { table = get.execute(); } catch (IOException e) { ApiErrorExtractor errorExtractor = new ApiErrorExtractor(); if (!errorExtractor.itemNotFound(e) || createDisposition != CreateDisposition.CREATE_IF_NEEDED) { // Rethrow. throw e; } } // If we want an empty table, and it isn't, then delete it first. if (table != null) { if (writeDisposition == WriteDisposition.WRITE_APPEND) { return table; } boolean empty = isEmpty(); if (empty) { if (writeDisposition == WriteDisposition.WRITE_TRUNCATE) { LOG.info("Empty table found, not removing {}", BigQueryIO.toTableSpec(ref)); } return table; } else if (writeDisposition == WriteDisposition.WRITE_EMPTY) { throw new IOException("WriteDisposition is WRITE_EMPTY, " + "but table is not empty"); } // Reuse the existing schema if none was provided. if (schema == null) { schema = table.getSchema(); } // Delete table and fall through to re-creating it below. LOG.info("Deleting table {}", BigQueryIO.toTableSpec(ref)); Bigquery.Tables.Delete delete = client.tables().delete(ref.getProjectId(), ref.getDatasetId(), ref.getTableId()); delete.execute(); } if (schema == null) { throw new IllegalArgumentException("Table schema required for new table."); } // Create the table. return tryCreateTable(schema); }