【问题标题】:big query python API insert null values through json大查询python API通过json插入空值
【发布时间】: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


【解决方案1】:

也许这里的问题是 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)])

一切顺利:

也许您可以做的是(如果您的代码由于某种原因接收到 json)首先将此 json 转换为元组列表,然后将此列表发送到 insert_data 方法,其中 NULL 值为 None .

【讨论】:

    猜你喜欢
    • 2018-12-17
    • 2017-05-11
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 2015-05-23
    相关资源
    最近更新 更多