【发布时间】:2017-05-10 19:01:02
【问题描述】:
我有一个包含 4 列的大查询表:name (string)、age(int)、score(float)、dob (datetime)。
#!/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。
默认情况下,在 python 中 null 是 None 。但是,我无法将其插入,因为我无法将 Nonetype 连接为 string 。 如果我尝试将 null 语句字符串化为:
ds=str(mydob) if mydob else 'null'
我得到'无效的日期时间字符串“null”'
我不确定我是否以错误的方式生成了我的 json。 enter image description here
我确实得到了空值,但为此我必须在 json 中省略该字段。
stream_data('["' + str(mynam) + '",' + str(mage) + ']')
如果我插入,我不能这样做,就好像我想输入 score 但将 dob 保留为 null
stream_data('["' + str(mynam) + '",' + str(mage) + ',' + str(myscore)+']')
这会在日期时间列中插入或尝试插入分数。所以我必须为json中的每一列插入一个值。但希望能够在插入时指定空值。
【问题讨论】:
-
尽量不要插入任何东西,而不是 Null 或 non 或 'null';像这样:
name,12,,123(不是两个逗号)。理想情况下,BQ 应默认为默认日期。如果没有,一些替代方案: - 自己推送默认日期(1970 年) - 将字段作为字符串,并写 null 代替(取决于你之后对日期的处理)。
标签: python json null google-bigquery google-cloud-platform