大查询python API通过json插入空值

时间:2017-05-10 19:01:02

标签: python json null google-bigquery google-cloud-platform

我有一个包含4列的大查询表:name(字符串),age(int),score(float),dob(datetime)。

quickSort(arr, 1, 5)
print(arr)

以上是测试我是否可以插入空值的示例。例如。我实际上计算得分和出生日期(假设)并插入它。但是如果计算不起作用,我想在大查询表中插入null,因为datetime支持null。

默认情况下,python中的null为None。但是我无法将其插入到因为我无法将Nonetype连接为字符串。  如果我尝试将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"'

我不确定我是否以错误的方式生成了json。 enter image description here

我确实得到了空值,但为此我必须省略json中的字段。

 ds=str(mydob) if mydob else 'null'

我不能这样做,好像我想输入分数,但如果我插入

,则将dob保留为null
   stream_data('["' + str(mynam) + '",' + str(mage) + ']')

这会在日期时间列中插入或尝试插入分数。所以我必须为json中的每一列插入一个值。但希望能够在插入时指定空值。

1 个答案:

答案 0 :(得分:0)

这里的问题可能是insert_data方法使用元组列表而不是json。

我刚刚在BQ中创建了一个像你一样的表,并使用了与你相同的代码,但我没有转换为json,而是使用docs中描述的函数,如下所示:

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