Skip to content

Commit 6afcb5b

Browse files
authored
Merge pull request #21938 from [cherry-pick][release-2.40.0] BigQueryIO: Adding the BASIC view setting to getTable request (#21879)
[cherry-pick][release-2.40.0] BigQueryIO: Adding the BASIC view setting to getTable request (#21879)
2 parents 12d0fe4 + 91ae5be commit 6afcb5b

8 files changed

Lines changed: 72 additions & 9 deletions

File tree

sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryHelpers.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.io.IOException;
3434
import java.math.BigInteger;
3535
import java.util.ArrayList;
36+
import java.util.Collections;
3637
import java.util.List;
3738
import java.util.Map;
3839
import java.util.UUID;
@@ -516,7 +517,9 @@ static String randomUUIDString() {
516517

517518
static void verifyTableNotExistOrEmpty(DatasetService datasetService, TableReference tableRef) {
518519
try {
519-
if (datasetService.getTable(tableRef) != null) {
520+
if (datasetService.getTable(
521+
tableRef, Collections.emptyList(), DatasetService.TableMetadataView.BASIC)
522+
!= null) {
520523
checkState(
521524
datasetService.isTableEmpty(tableRef),
522525
"BigQuery table is not empty: %s.",

sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryServices.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,16 @@ JobStatistics dryRunQuery(
111111

112112
/** An interface to get, create and delete Cloud BigQuery datasets and tables. */
113113
public interface DatasetService extends AutoCloseable {
114+
115+
// maps the values at
116+
// https://cloud.google.com/bigquery/docs/reference/rest/v2/tables/get#TableMetadataView
117+
enum TableMetadataView {
118+
TABLE_METADATA_VIEW_UNSPECIFIED,
119+
BASIC,
120+
STORAGE_STATS,
121+
FULL;
122+
};
123+
114124
/**
115125
* Gets the specified {@link Table} resource by table ID.
116126
*
@@ -123,6 +133,10 @@ public interface DatasetService extends AutoCloseable {
123133
Table getTable(TableReference tableRef, List<String> selectedFields)
124134
throws InterruptedException, IOException;
125135

136+
@Nullable
137+
Table getTable(TableReference tableRef, List<String> selectedFields, TableMetadataView view)
138+
throws InterruptedException, IOException;
139+
126140
/** Creates the specified table if it does not exist. */
127141
void createTable(Table table) throws InterruptedException, IOException;
128142

sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryServicesImpl.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -616,13 +616,24 @@ private DatasetServiceImpl(BigQueryOptions bqOptions) {
616616
@Override
617617
public @Nullable Table getTable(TableReference tableRef, List<String> selectedFields)
618618
throws IOException, InterruptedException {
619-
return getTable(tableRef, selectedFields, createDefaultBackoff(), Sleeper.DEFAULT);
619+
return getTable(tableRef, selectedFields, TableMetadataView.STORAGE_STATS);
620+
}
621+
622+
@Override
623+
public @Nullable Table getTable(
624+
TableReference tableRef, List<String> selectedFields, TableMetadataView view)
625+
throws IOException, InterruptedException {
626+
return getTable(tableRef, selectedFields, view, createDefaultBackoff(), Sleeper.DEFAULT);
620627
}
621628

622629
@VisibleForTesting
623630
@Nullable
624631
Table getTable(
625-
TableReference ref, List<String> selectedFields, BackOff backoff, Sleeper sleeper)
632+
TableReference ref,
633+
List<String> selectedFields,
634+
TableMetadataView view,
635+
BackOff backoff,
636+
Sleeper sleeper)
626637
throws IOException, InterruptedException {
627638
Tables.Get get =
628639
client
@@ -632,6 +643,9 @@ Table getTable(
632643
if (!selectedFields.isEmpty()) {
633644
get.setSelectedFields(String.join(",", selectedFields));
634645
}
646+
if (view != null) {
647+
get.set("view", view.name());
648+
}
635649
try {
636650
return executeWithRetries(
637651
get,

sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/CreateTableHelpers.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,9 @@ private static void tryCreateTable(
112112
tableReference.setTableId(BigQueryHelpers.stripPartitionDecorator(tableReference.getTableId()));
113113
try (DatasetService datasetService =
114114
bqServices.getDatasetService(context.getPipelineOptions().as(BigQueryOptions.class))) {
115-
if (datasetService.getTable(tableReference) == null) {
115+
if (datasetService.getTable(
116+
tableReference, Collections.emptyList(), DatasetService.TableMetadataView.BASIC)
117+
== null) {
116118
TableSchema tableSchema = schemaSupplier.get();
117119
Preconditions.checkArgumentNotNull(
118120
tableSchema,

sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/TableSchemaCache.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.google.api.services.bigquery.model.TableSchema;
2323
import com.google.auto.value.AutoValue;
2424
import java.io.IOException;
25+
import java.util.Collections;
2526
import java.util.Map;
2627
import java.util.Optional;
2728
import java.util.concurrent.ExecutionException;
@@ -166,7 +167,12 @@ public TableSchema getSchema(TableReference tableReference, DatasetService datas
166167
if (!schemaHolder.isPresent()) {
167168
// Not initialized. Query the new schema with the monitor released and then update the cache.
168169
try {
169-
@Nullable Table table = datasetService.getTable(tableReference);
170+
// requesting the BASIC view will prevent BQ backend to run calculations
171+
// related with storage stats that are not needed here
172+
@Nullable
173+
Table table =
174+
datasetService.getTable(
175+
tableReference, Collections.emptyList(), DatasetService.TableMetadataView.BASIC);
170176
schemaHolder =
171177
Optional.ofNullable((table == null) ? null : SchemaHolder.of(table.getSchema(), 0));
172178
} catch (Exception e) {
@@ -298,7 +304,12 @@ private Map<String, TableSchema> refreshAll(Map<String, Refresh> tables)
298304
Map<String, TableSchema> schemas = Maps.newHashMapWithExpectedSize(tables.size());
299305
for (Map.Entry<String, Refresh> entry : tables.entrySet()) {
300306
TableReference tableReference = BigQueryHelpers.parseTableSpec(entry.getKey());
301-
Table table = entry.getValue().getDatasetService().getTable(tableReference);
307+
Table table =
308+
entry
309+
.getValue()
310+
.getDatasetService()
311+
.getTable(
312+
tableReference, Collections.emptyList(), DatasetService.TableMetadataView.BASIC);
302313
if (table == null) {
303314
throw new RuntimeException("Did not get value for table " + tableReference);
304315
}

sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/testing/FakeDatasetService.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,23 @@ public Table getTable(TableReference tableRef) throws InterruptedException, IOEx
173173
@Override
174174
public Table getTable(TableReference tableRef, @Nullable List<String> selectedFields)
175175
throws InterruptedException, IOException {
176+
return getTable(tableRef, selectedFields, null);
177+
}
178+
179+
@Override
180+
public Table getTable(
181+
TableReference tableRef,
182+
@Nullable List<String> selectedFields,
183+
@Nullable TableMetadataView view)
184+
throws InterruptedException, IOException {
185+
return getTableImpl(tableRef, selectedFields, view);
186+
}
187+
188+
public Table getTableImpl(
189+
TableReference tableRef,
190+
@Nullable List<String> selectedFields,
191+
@Nullable TableMetadataView view)
192+
throws InterruptedException, IOException {
176193
synchronized (FakeDatasetService.class) {
177194
Map<String, TableContainer> dataset =
178195
tables.get(tableRef.getProjectId(), tableRef.getDatasetId());

sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryServicesImplTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ public void testGetTableSucceeds() throws Exception {
474474

475475
Table table =
476476
datasetService.getTable(
477-
tableRef, Collections.emptyList(), BackOff.ZERO_BACKOFF, Sleeper.DEFAULT);
477+
tableRef, Collections.emptyList(), null, BackOff.ZERO_BACKOFF, Sleeper.DEFAULT);
478478

479479
assertEquals(testTable, table);
480480
verifyAllResponsesAreRead();
@@ -499,7 +499,7 @@ public void testGetTableNotFound() throws IOException, InterruptedException {
499499
.setTableId("tableId");
500500
Table table =
501501
datasetService.getTable(
502-
tableRef, Collections.emptyList(), BackOff.ZERO_BACKOFF, Sleeper.DEFAULT);
502+
tableRef, Collections.emptyList(), null, BackOff.ZERO_BACKOFF, Sleeper.DEFAULT);
503503

504504
assertNull(table);
505505
verifyAllResponsesAreRead();
@@ -526,7 +526,7 @@ public void testGetTableThrows() throws Exception {
526526
new BigQueryServicesImpl.DatasetServiceImpl(
527527
bigquery, null, PipelineOptionsFactory.create());
528528
datasetService.getTable(
529-
tableRef, Collections.emptyList(), BackOff.STOP_BACKOFF, Sleeper.DEFAULT);
529+
tableRef, Collections.emptyList(), null, BackOff.STOP_BACKOFF, Sleeper.DEFAULT);
530530
}
531531

532532
@Test

sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryUtilTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,15 @@ private void onTableGet(Table table) throws IOException {
125125
when(mockClient.tables()).thenReturn(mockTables);
126126
when(mockTables.get(anyString(), anyString(), anyString())).thenReturn(mockTablesGet);
127127
when(mockTablesGet.setPrettyPrint(false)).thenReturn(mockTablesGet);
128+
when(mockTablesGet.set(anyString(), anyString())).thenReturn(mockTablesGet);
128129
when(mockTablesGet.execute()).thenReturn(table);
129130
}
130131

131132
private void verifyTableGet() throws IOException {
132133
verify(mockClient).tables();
133134
verify(mockTables).get("project", "dataset", "table");
134135
verify(mockTablesGet, atLeastOnce()).setPrettyPrint(false);
136+
verify(mockTablesGet, atLeastOnce()).set(anyString(), anyString());
135137
verify(mockTablesGet, atLeastOnce()).execute();
136138
}
137139

0 commit comments

Comments
 (0)