Skip to content

Commit 7c759be

Browse files
authored
feat(bigquery): export HivePartitioningOptions in load job configurations (#3877)
1 parent bc3bf1c commit 7c759be

File tree

3 files changed

+46
-19
lines changed

3 files changed

+46
-19
lines changed

Diff for: bigquery/external.go

+15-19
Original file line numberDiff line numberDiff line change
@@ -100,19 +100,17 @@ type ExternalDataConfig struct {
100100

101101
func (e *ExternalDataConfig) toBQ() bq.ExternalDataConfiguration {
102102
q := bq.ExternalDataConfiguration{
103-
SourceFormat: string(e.SourceFormat),
104-
SourceUris: e.SourceURIs,
105-
Autodetect: e.AutoDetect,
106-
Compression: string(e.Compression),
107-
IgnoreUnknownValues: e.IgnoreUnknownValues,
108-
MaxBadRecords: e.MaxBadRecords,
103+
SourceFormat: string(e.SourceFormat),
104+
SourceUris: e.SourceURIs,
105+
Autodetect: e.AutoDetect,
106+
Compression: string(e.Compression),
107+
IgnoreUnknownValues: e.IgnoreUnknownValues,
108+
MaxBadRecords: e.MaxBadRecords,
109+
HivePartitioningOptions: e.HivePartitioningOptions.toBQ(),
109110
}
110111
if e.Schema != nil {
111112
q.Schema = e.Schema.toBQ()
112113
}
113-
if e.HivePartitioningOptions != nil {
114-
q.HivePartitioningOptions = e.HivePartitioningOptions.toBQ()
115-
}
116114
if e.Options != nil {
117115
e.Options.populateExternalDataConfig(&q)
118116
}
@@ -121,13 +119,14 @@ func (e *ExternalDataConfig) toBQ() bq.ExternalDataConfiguration {
121119

122120
func bqToExternalDataConfig(q *bq.ExternalDataConfiguration) (*ExternalDataConfig, error) {
123121
e := &ExternalDataConfig{
124-
SourceFormat: DataFormat(q.SourceFormat),
125-
SourceURIs: q.SourceUris,
126-
AutoDetect: q.Autodetect,
127-
Compression: Compression(q.Compression),
128-
IgnoreUnknownValues: q.IgnoreUnknownValues,
129-
MaxBadRecords: q.MaxBadRecords,
130-
Schema: bqToSchema(q.Schema),
122+
SourceFormat: DataFormat(q.SourceFormat),
123+
SourceURIs: q.SourceUris,
124+
AutoDetect: q.Autodetect,
125+
Compression: Compression(q.Compression),
126+
IgnoreUnknownValues: q.IgnoreUnknownValues,
127+
MaxBadRecords: q.MaxBadRecords,
128+
Schema: bqToSchema(q.Schema),
129+
HivePartitioningOptions: bqToHivePartitioningOptions(q.HivePartitioningOptions),
131130
}
132131
switch {
133132
case q.CsvOptions != nil:
@@ -141,9 +140,6 @@ func bqToExternalDataConfig(q *bq.ExternalDataConfiguration) (*ExternalDataConfi
141140
return nil, err
142141
}
143142
}
144-
if q.HivePartitioningOptions != nil {
145-
e.HivePartitioningOptions = bqToHivePartitioningOptions(q.HivePartitioningOptions)
146-
}
147143
return e, nil
148144
}
149145

Diff for: bigquery/load.go

+6
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ type LoadConfig struct {
6565
// For ingestion from datastore backups, ProjectionFields governs which fields
6666
// are projected from the backup. The default behavior projects all fields.
6767
ProjectionFields []string
68+
69+
// HivePartitioningOptions allows use of Hive partitioning based on the
70+
// layout of objects in Cloud Storage.
71+
HivePartitioningOptions *HivePartitioningOptions
6872
}
6973

7074
func (l *LoadConfig) toBQ() (*bq.JobConfiguration, io.Reader) {
@@ -81,6 +85,7 @@ func (l *LoadConfig) toBQ() (*bq.JobConfiguration, io.Reader) {
8185
SchemaUpdateOptions: l.SchemaUpdateOptions,
8286
UseAvroLogicalTypes: l.UseAvroLogicalTypes,
8387
ProjectionFields: l.ProjectionFields,
88+
HivePartitioningOptions: l.HivePartitioningOptions.toBQ(),
8489
},
8590
}
8691
media := l.Src.populateLoadConfig(config.Load)
@@ -100,6 +105,7 @@ func bqToLoadConfig(q *bq.JobConfiguration, c *Client) *LoadConfig {
100105
SchemaUpdateOptions: q.Load.SchemaUpdateOptions,
101106
UseAvroLogicalTypes: q.Load.UseAvroLogicalTypes,
102107
ProjectionFields: q.Load.ProjectionFields,
108+
HivePartitioningOptions: bqToHivePartitioningOptions(q.Load.HivePartitioningOptions),
103109
}
104110
var fc *FileConfig
105111
if len(q.Load.SourceUris) == 0 {

Diff for: bigquery/load_test.go

+25
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,31 @@ func TestLoad(t *testing.T) {
342342
return j
343343
}(),
344344
},
345+
{
346+
dst: c.Dataset("dataset-id").Table("table-id"),
347+
src: func() *GCSReference {
348+
g := NewGCSReference("uri")
349+
g.SourceFormat = Parquet
350+
return g
351+
}(),
352+
config: LoadConfig{
353+
HivePartitioningOptions: &HivePartitioningOptions{
354+
Mode: CustomHivePartitioningMode,
355+
SourceURIPrefix: "source_uri",
356+
RequirePartitionFilter: true,
357+
},
358+
},
359+
want: func() *bq.Job {
360+
j := defaultLoadJob()
361+
j.Configuration.Load.SourceFormat = "PARQUET"
362+
j.Configuration.Load.HivePartitioningOptions = &bq.HivePartitioningOptions{
363+
Mode: "CUSTOM",
364+
RequirePartitionFilter: true,
365+
SourceUriPrefix: "source_uri",
366+
}
367+
return j
368+
}(),
369+
},
345370
}
346371

347372
for i, tc := range testCases {

0 commit comments

Comments
 (0)