谷歌 BigQuery API Python

Posted

技术标签:

【中文标题】谷歌 BigQuery API Python【英文标题】:Google BigQuery API Python 【发布时间】:2018-07-08 17:11:01 【问题描述】:

我正在尝试在 python 中生成查询并使用它们进行查询。我正在使用 pandas_gbq。我的代码如下所示:

def generate_query(
    filter=['CENTRAL BANK','DRAGHI','FRANKFURT'],
    date ='20171214',
    datetimeformat='%Y%m%d',
    weekly_data=True
):
    filter = str(filter).replace('[','').replace(']','')
    if weekly_data == False:
        query = '''SELECT * FROM `gdelt-bq.gdeltv2.events` WHERE SQLDATE = date'''.format(date = date)
    else:
        date = datetime.datetime.strptime(date, datetimeformat)
        week = generate_week(date)
        query = '''SELECT * FROM `gdelt-bq.gdeltv2.events` WHERE SQLDATE IN (week)'''.format(
            week = week).replace('[','').replace(']','')
    return query, date

不知道如何在 *** 上缩进代码。尝试查询多个日期时出现问题:

'SELECT * FROM `gdelt-bq.gdeltv2.events` WHERE SQLDATE IN (\\'20171211\\', \\'20171212\\', \\'20171213\\', \\'20171214\\', \\'20171215\\')'

我不知道反斜杠是从哪里来的。知道为什么会这样吗?

函数 generate_week:

def generate_week(date):
week = []
referenceday = date - datetime.timedelta(days = date.weekday())
for i in range(0,5):
    day = referenceday + datetime.timedelta(days = i)
    week.append(day.strftime('%Y%m%d'))
return week

返回的错误如下:

pandas_gbq.gbq.GenericGBQException: Reason: 400 No matching signature for operator IN for argument types INT64 and STRING at [1:55]

我会非常感谢这里的一些帮助! :)

【问题讨论】:

您的方法generate_week 似乎无法正常工作。也许它也有助于发布它的代码。 我做到了。谢谢:) 这确实是一个你应该使用query parameters而不是操纵查询文本的情况。你会想使用例如SQLDATE IN UNNEST(@dates) 其中datesARRAY<STRING> 参数。 我认为你是对的。使用通常的 Python API,我会知道如何实现这一点。知道如何用 pandas GBQ 做到这一点吗? :) 【参考方案1】:

我相信您的问题与日期格式有关。除非您另有说明,否则标准 BQ 需要 yyyy-mm-dd 格式。阅读更多here。如果您使用strftime("%Y-%m-%d"),那就足够了。

另外值得指出的是:

    如果您使用元组而不是列表,SQL 将使用与 Python 相同的语法,因此您可以避免替换方括号(让生活更轻松)。 您可以将 SQL 的 BETWEEN 与开始日期和结束日期(含)一起使用,而不是列出连续的连续时间段的每个日期。

    如果您使用的是 Python 3.6+,那么在这种情况下,f-strings 比 .format 好一点。包括项目符号 1(但不是项目符号 2)中的更改,您可以改为:

    f'''SELECT * FROM `gdelt-bq.gdeltv2.events` WHERE SQLDATE IN week'''

【讨论】:

以上是关于谷歌 BigQuery API Python的主要内容,如果未能解决你的问题,请参考以下文章

谷歌 BigQuery API Python

BigQuery API 通信公共互联网/谷歌内网

谷歌 bigquery - 更新 sql?

如何在第三方 API 中发出请求并在 google BigQuery 上定期加载结果?我应该使用哪些谷歌服务?

流式 BigQuery API

在 BigQuery 中将 API 调用作为 UDF 的一部分 - 可能吗?