名前(文字列)、年齢(int)、スコア(浮動小数点数)、dob(日時)の4つの列を持つ大きなクエリテーブルがあります。big query python API jsonからnull値を挿入
#!/usr/bin/env python
import json
from google.cloud import bigquery
def stream_data(json_data):
bigquery_client = bigquery.Client("myproject")
dataset = bigquery_client.dataset("ComputedData")
table = dataset.table("test")
data = json.loads(json_data)
table.reload()
rows = [data]
errors = table.insert_data(rows)
if not errors:
print('Loaded 1 row ')
else:
print('Errors: {}'.format(errors))
if __name__ == '__main__':
mynam = 'mike'
mage = 212
mydob='1983-09-01 00:00:00'
mydob=None
ds=str(mydob) if mydob else None
myscore = 0;
stream_data('["' + str(mynam) + '",' + str(mage) + ',"' + ds + '",'+ str(myscore) +']')
上記は、null値を挿入できるかどうかをテストするサンプルです。たとえば。私は実際にスコアと生年月日(仮定)を計算して挿入します。しかし、計算がうまくいかない場合、datetimeがnullをサポートするので、大きなクエリテーブルにnullを挿入したい。
デフォルトでは、nullはPythonではNoneです。しかし、私は文字列としてNonetypeを連結できないので、これを挿入することはできません。 私のようにヌル文を文字列化しようとした場合:
ds=str(mydob) if mydob else 'null'
私は私が私のJSON間違った方法を生成していた場合、私はわからない「無効な日時文字列 『ヌル』」
を取得します。 enter image description here
nullを取得しますが、そのためにはjsonのフィールドを除外する必要があります。
stream_data('["' + str(mynam) + '",' + str(mage) + ']')
私は
stream_data('["' + str(mynam) + '",' + str(mage) + ',' + str(myscore)+']')
を挿入する場合、私はスコアを入力しますが、nullとしてDOBを残したいかのように私はこれを行うことはできません、これは挿入または日時列にスコアを挿入しようとします。だから私はjsonのすべての列の値を挿入する必要があります。挿入中にヌルを指定できるようにする必要があります。
NullまたはNull以外のものを挿入しないでください。このように: 'name、12、、123'(2つのカンマではない) BQは、デフォルトの日付に設定するのが理想的です。 一部の代替方法: - デフォルトの日付を自分自身にプッシュします(1970) - フィールドを文字列として置き、代わりにnullを書き込みます(その後の日付で何をするかによって異なります)。 – Jon