Skip to content

Commit 1fcd53d

Browse files
Leon de Almeidalukesneeringer
authored andcommitted
nullMarker support for BigQuery Load Jobs (#3449) (#3777)
1 parent c24123c commit 1fcd53d

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

bigquery/google/cloud/bigquery/job.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,7 @@ class _LoadConfiguration(object):
518518
_field_delimiter = None
519519
_ignore_unknown_values = None
520520
_max_bad_records = None
521+
_null_marker = None
521522
_quote_character = None
522523
_skip_leading_rows = None
523524
_source_format = None
@@ -672,6 +673,11 @@ def output_rows(self):
672673
https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#configuration.load.maxBadRecords
673674
"""
674675

676+
null_marker = _TypedProperty('null_marker', six.string_types)
677+
"""See
678+
https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#configuration.load.nullMarker
679+
"""
680+
675681
quote_character = _TypedProperty('quote_character', six.string_types)
676682
"""See
677683
https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#configuration.load.quote
@@ -710,6 +716,8 @@ def _populate_config_resource(self, configuration):
710716
configuration['ignoreUnknownValues'] = self.ignore_unknown_values
711717
if self.max_bad_records is not None:
712718
configuration['maxBadRecords'] = self.max_bad_records
719+
if self.null_marker is not None:
720+
configuration['nullMarker'] = self.null_marker
713721
if self.quote_character is not None:
714722
configuration['quote'] = self.quote_character
715723
if self.skip_leading_rows is not None:

bigquery/tests/unit/test_job.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,11 @@ def _verifyResourceProperties(self, job, resource):
247247
config['maxBadRecords'])
248248
else:
249249
self.assertIsNone(job.max_bad_records)
250+
if 'nullMarker' in config:
251+
self.assertEqual(job.null_marker,
252+
config['nullMarker'])
253+
else:
254+
self.assertIsNone(job.null_marker)
250255
if 'quote' in config:
251256
self.assertEqual(job.quote_character,
252257
config['quote'])
@@ -288,6 +293,7 @@ def test_ctor(self):
288293
self.assertIsNone(job.field_delimiter)
289294
self.assertIsNone(job.ignore_unknown_values)
290295
self.assertIsNone(job.max_bad_records)
296+
self.assertIsNone(job.null_marker)
291297
self.assertIsNone(job.quote_character)
292298
self.assertIsNone(job.skip_leading_rows)
293299
self.assertIsNone(job.source_format)
@@ -592,6 +598,7 @@ def test_begin_w_alternate_client(self):
592598
'fieldDelimiter': '|',
593599
'ignoreUnknownValues': True,
594600
'maxBadRecords': 100,
601+
'nullMarker': r'\N',
595602
'quote': "'",
596603
'skipLeadingRows': 1,
597604
'sourceFormat': 'CSV',
@@ -619,6 +626,7 @@ def test_begin_w_alternate_client(self):
619626
job.field_delimiter = '|'
620627
job.ignore_unknown_values = True
621628
job.max_bad_records = 100
629+
job.null_marker = r'\N'
622630
job.quote_character = "'"
623631
job.skip_leading_rows = 1
624632
job.source_format = 'CSV'

0 commit comments

Comments
 (0)