Skip to content

Commit b5431b0

Browse files
committed
feat: add support for Hive partitioning options when creating external tables (#235)
1 parent 6213ea9 commit b5431b0

File tree

3 files changed

+38
-0
lines changed

3 files changed

+38
-0
lines changed

google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/ExternalTableDefinition.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ public Builder setFormatOptions(FormatOptions formatOptions) {
135135
/** Sets the table schema. */
136136
public abstract Builder setSchema(Schema schema);
137137

138+
/** Sets the table Hive partitioning options. */
139+
public abstract Builder setHivePartitioningOptions(HivePartitioningOptions hivePartitioningOptions);
140+
138141
/** Creates an {@code ExternalTableDefinition} object. */
139142
@Override
140143
public abstract ExternalTableDefinition build();
@@ -212,6 +215,13 @@ public <F extends FormatOptions> F getFormatOptions() {
212215
@Nullable
213216
public abstract Boolean getAutodetect();
214217

218+
/**
219+
* [Experimental] Returns the HivePartitioningOptions when the data layout follows Hive partitioning convention
220+
*/
221+
@SuppressWarnings("unchecked")
222+
@Nullable
223+
public abstract HivePartitioningOptions getHivePartitioningOptions();
224+
215225
/** Returns a builder for the {@code ExternalTableDefinition} object. */
216226
public abstract Builder toBuilder();
217227

@@ -257,6 +267,9 @@ com.google.api.services.bigquery.model.ExternalDataConfiguration toExternalDataC
257267
if (getAutodetect() != null) {
258268
externalConfigurationPb.setAutodetect(getAutodetect());
259269
}
270+
if (getHivePartitioningOptions() != null) {
271+
externalConfigurationPb.setHivePartitioningOptions(getHivePartitioningOptions().toPb());
272+
}
260273
return externalConfigurationPb;
261274
}
262275

@@ -405,6 +418,10 @@ static ExternalTableDefinition fromPb(Table tablePb) {
405418
}
406419
builder.setMaxBadRecords(externalDataConfiguration.getMaxBadRecords());
407420
builder.setAutodetect(externalDataConfiguration.getAutodetect());
421+
if (externalDataConfiguration.getHivePartitioningOptions() != null) {
422+
builder.setHivePartitioningOptions(
423+
HivePartitioningOptions.fromPb(externalDataConfiguration.getHivePartitioningOptions()));
424+
}
408425
}
409426
return builder.build();
410427
}
@@ -444,6 +461,10 @@ static ExternalTableDefinition fromExternalDataConfiguration(
444461
if (externalDataConfiguration.getAutodetect() != null) {
445462
builder.setAutodetect(externalDataConfiguration.getAutodetect());
446463
}
464+
if (externalDataConfiguration.getHivePartitioningOptions() != null) {
465+
builder.setHivePartitioningOptions(
466+
HivePartitioningOptions.fromPb(externalDataConfiguration.getHivePartitioningOptions()));
467+
}
447468
return builder.build();
448469
}
449470
}

google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/HivePartitioningOptions.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,15 @@ public String toString() {
103103
.toString();
104104
}
105105

106+
@Override
107+
public boolean equals(Object obj) {
108+
return obj == this
109+
|| obj != null
110+
&& obj.getClass().equals(HivePartitioningOptions.class)
111+
&& Objects.equals(mode, ((HivePartitioningOptions) obj).getMode())
112+
&& Objects.equals(sourceUriPrefix, ((HivePartitioningOptions) obj).getSourceUriPrefix());
113+
}
114+
106115
@Override
107116
public int hashCode() {
108117
return Objects.hash(mode, sourceUriPrefix);

google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/ExternalTableDefinitionTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,18 @@ public class ExternalTableDefinitionTest {
4646
private static final String COMPRESSION = "GZIP";
4747
private static final Boolean AUTODETECT = true;
4848
private static final CsvOptions CSV_OPTIONS = CsvOptions.newBuilder().build();
49+
private static final HivePartitioningOptions HIVE_PARTITIONING_OPTIONS =
50+
HivePartitioningOptions.newBuilder()
51+
.setMode("AUTO")
52+
.setSourceUriPrefix(SOURCE_URIS.get(0))
53+
.build();
4954
private static final ExternalTableDefinition EXTERNAL_TABLE_DEFINITION =
5055
ExternalTableDefinition.newBuilder(SOURCE_URIS, TABLE_SCHEMA, CSV_OPTIONS)
5156
.setCompression(COMPRESSION)
5257
.setIgnoreUnknownValues(IGNORE_UNKNOWN_VALUES)
5358
.setMaxBadRecords(MAX_BAD_RECORDS)
5459
.setAutodetect(AUTODETECT)
60+
.setHivePartitioningOptions(HIVE_PARTITIONING_OPTIONS)
5561
.build();
5662

5763
@Test
@@ -83,6 +89,7 @@ public void testBuilder() {
8389
assertEquals(TABLE_SCHEMA, EXTERNAL_TABLE_DEFINITION.getSchema());
8490
assertEquals(SOURCE_URIS, EXTERNAL_TABLE_DEFINITION.getSourceUris());
8591
assertEquals(AUTODETECT, EXTERNAL_TABLE_DEFINITION.getAutodetect());
92+
assertEquals(HIVE_PARTITIONING_OPTIONS, EXTERNAL_TABLE_DEFINITION.getHivePartitioningOptions());
8693
}
8794

8895
@Test
@@ -107,5 +114,6 @@ private void compareExternalTableDefinition(
107114
assertEquals(expected.getSourceUris(), value.getSourceUris());
108115
assertEquals(expected.hashCode(), value.hashCode());
109116
assertEquals(expected.getAutodetect(), value.getAutodetect());
117+
assertEquals(expected.getHivePartitioningOptions(), value.getHivePartitioningOptions());
110118
}
111119
}

0 commit comments

Comments
 (0)