Skip to content

Commit 618ce09

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

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,14 @@ 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 Builder setHivePartitioningOptions(HivePartitioningOptions hivePartitioningOptions) {
140+
return setHivePartitioningOptionsInner(hivePartitioningOptions);
141+
};
142+
143+
abstract Builder setHivePartitioningOptionsInner(
144+
HivePartitioningOptions hivePartitioningOptions);
145+
138146
/** Creates an {@code ExternalTableDefinition} object. */
139147
@Override
140148
public abstract ExternalTableDefinition build();
@@ -212,6 +220,17 @@ public <F extends FormatOptions> F getFormatOptions() {
212220
@Nullable
213221
public abstract Boolean getAutodetect();
214222

223+
/**
224+
* [Experimental] Returns the HivePartitioningOptions when the data layout follows Hive
225+
* partitioning convention
226+
*/
227+
@SuppressWarnings("unchecked")
228+
@Nullable
229+
public HivePartitioningOptions getHivePartitioningOptions() {
230+
return getHivePartitioningOptionsInner();
231+
}
232+
233+
abstract HivePartitioningOptions getHivePartitioningOptionsInner();
215234
/** Returns a builder for the {@code ExternalTableDefinition} object. */
216235
public abstract Builder toBuilder();
217236

@@ -257,6 +276,9 @@ com.google.api.services.bigquery.model.ExternalDataConfiguration toExternalDataC
257276
if (getAutodetect() != null) {
258277
externalConfigurationPb.setAutodetect(getAutodetect());
259278
}
279+
if (getHivePartitioningOptions() != null) {
280+
externalConfigurationPb.setHivePartitioningOptions(getHivePartitioningOptions().toPb());
281+
}
260282
return externalConfigurationPb;
261283
}
262284

@@ -405,6 +427,10 @@ static ExternalTableDefinition fromPb(Table tablePb) {
405427
}
406428
builder.setMaxBadRecords(externalDataConfiguration.getMaxBadRecords());
407429
builder.setAutodetect(externalDataConfiguration.getAutodetect());
430+
if (externalDataConfiguration.getHivePartitioningOptions() != null) {
431+
builder.setHivePartitioningOptions(
432+
HivePartitioningOptions.fromPb(externalDataConfiguration.getHivePartitioningOptions()));
433+
}
408434
}
409435
return builder.build();
410436
}
@@ -444,6 +470,10 @@ static ExternalTableDefinition fromExternalDataConfiguration(
444470
if (externalDataConfiguration.getAutodetect() != null) {
445471
builder.setAutodetect(externalDataConfiguration.getAutodetect());
446472
}
473+
if (externalDataConfiguration.getHivePartitioningOptions() != null) {
474+
builder.setHivePartitioningOptions(
475+
HivePartitioningOptions.fromPb(externalDataConfiguration.getHivePartitioningOptions()));
476+
}
447477
return builder.build();
448478
}
449479
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,16 @@ 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(
113+
sourceUriPrefix, ((HivePartitioningOptions) obj).getSourceUriPrefix());
114+
}
115+
106116
@Override
107117
public int hashCode() {
108118
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)