BigQuery 使用 Python Google Cloud 库将日期插入“DATE”类型字段

Posted

技术标签:

【中文标题】BigQuery 使用 Python Google Cloud 库将日期插入“DATE”类型字段【英文标题】:BigQuery insert dates into 'DATE' type field using Python Google Cloud library 【发布时间】:2017-10-31 16:06:06 【问题描述】:

我正在使用 Python 2.7 和适用于 Python 的 Google Cloud 客户端库 (v0.27.0) 将数据插入 BigQuery 表(使用 table.insert_data())。

我表中的一个字段的类型为“DATE”。

在我的 Python 脚本中,我已将日期数据格式化为“YYYY-MM-DD”,但不幸的是,Google Cloud 库对该字段返回“无效日期:”错误。

我尝试过以多种方式格式化日期字段(即“YYYYMMDD”、时间戳等),但到目前为止还没有成功...

不幸的是,API 文档 (https://googlecloudplatform.github.io/google-cloud-python/latest/) 没有提及 Python 中所需的日期格式/类型/对象。

这是我的代码:

from google.cloud import bigquery
import pandas as pd
import json
from pprint import pprint
from collections import OrderedDict

# Using a pandas dataframe 'df' as input

# Converting date field to YYYY-MM-DD format

df['DATE_VALUE_LOCAL'] = df['DATE_VALUE_LOCAL'].apply(lambda x: x.strftime('%Y-%m-%d'))

# Converting pandas dataframe to json

json_data = df.to_json(orient='records',date_format='iso')

# Instantiates a client
bigquery_client = bigquery.Client(project="xxx")

# The name for the new dataset
dataset_name = 'dataset_name'
table_name = 'table_name'

def stream_data(dataset_name, table_name, json_data):
    dataset = bigquery_client.dataset(dataset_name)
    table = dataset.table(table_name)

    data = json.loads(json_data, object_pairs_hook=OrderedDict)

    # Reload the table to get the schema.
    table.reload()

    errors = table.insert_data(data)

    if not errors:
        print('Loaded 1 row into :'.format(dataset_name, table_name))
    else:
        print('Errors:')
        pprint(errors)

stream_data(dataset_name, table_name, json_data)

将我的日期插入 BigQuery DATE 字段所需的 Python 日期格式/类型/对象是什么?

【问题讨论】:

这很奇怪。因为它应该可以工作......你使用的是什么版本的python客户端?你也可以分享你的脚本吗? 我正在使用 v0.28.0 的 Python 客户端。我已经用代码示例更新了我的问题。谢谢! 您可能正在使用 v0.27.0 和 0.28 中的方法 insert_data no longer exists 啊,21 小时前客户端更新了。你说得对,我用的是 0.27.0。我将重写我的代码以使其在 0.28.0 上运行并检查问题是否会得到解决 【参考方案1】:

我刚刚在这里模拟了您的代码,一切正常。这是我模拟的:

import pandas as pd
import json
import os
from collections import OrderedDict
from google.cloud.bigquery import Client

d = 'ed': ['3', '5'],
     'date': ['2017-10-11', '2017-11-12']
json_data = df.to_json(orient='records', date_formate='iso')
json_data = json.loads(json_data, object_pairs_hook=OrderedDict)

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = '/key.json'
bc = Client()
ds = bc.dataset('dataset name')
table = ds.table('table I just created')
table = bc.get_table(table)
bc.create_rows(table, json_data)

它使用的是0.28.0版本,但它仍然是与以前版本相同的方法。

您可能在某个步骤中发生了一些错误,可能是将日期转换为其他无法识别的 BQ 格式。尝试使用此脚本作为参考,以查看代码中可能发生错误的位置。

【讨论】:

以上是关于BigQuery 使用 Python Google Cloud 库将日期插入“DATE”类型字段的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 google-api-python-client 设置 BigQuery 配置属性?

在 google bigquery 中,如何使用 google python 客户端使用 javascript UDF

使用 Google BigQuery Python 库创建或替换表

BigQuery 使用 Python Google Cloud 库将日期插入“DATE”类型字段

Google BigQuery:通过 Python google-cloud-bigquery 版本 0.27.0 与 0.28.0 创建视图

使用 Python,将 google.cloud.bigquery.job.query.QueryJob 输出保存到本地 JSON 文件