2017-05-10 2 views
0

名前(文字列)、年齢(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のすべての列の値を挿入する必要があります。挿入中にヌルを指定できるようにする必要があります。

+0

NullまたはNull以外のものを挿入しないでください。このように: 'name、12、、123'(2つのカンマではない) BQは、デフォルトの日付に設定するのが理想的です。 一部の代替方法: - デフォルトの日付を自分自身にプッシュします(1970) - フィールドを文字列として置き、代わりにnullを書き込みます(その後の日付で何をするかによって異なります)。 – Jon

答えて

0

おそらく、ここでの問題は、insert_dataメソッドがjsonではなくタプルのリストで動作することです。

私はちょうどBQであなたのような表を作成し、あなたと同じコードを使用しますが、それはdocsで説明していますよう代わりにJSONに変換するの私はそうのように、機能を使用:テストの中で

error = table.insert_data([('name1', 200, None, '1990-09-09 00:00:00'), 
          ('name2', 201, 67.3,)]) 

私は、私も試みた:

error = table.insert_data([('name3', 301, 35.4,None)]) 

も:

error = table.insert_data([(None, None, None,None)]) 

これは、すべてが働いた:

enter image description here

はたぶん、あなたは何ができるかである(あなたのコードが何らかの理由でJSONを受信した場合)最初のタプルのリストにこのJSONを変換してからinsert_dataメソッドにこのリストを送信しますNULLの値はNoneとなります。

関連する問題