根据 Python 函数输出指定的列在 Google BigQuery 上进行查询

Posted

技术标签:

【中文标题】根据 Python 函数输出指定的列在 Google BigQuery 上进行查询【英文标题】:Making query on Google BigQuery, depending on column specified by Python function output 【发布时间】:2020-05-04 21:44:17 【问题描述】:

我有一个简单的 html 页面,要求用户输入并提交他们选择的动物的名称。然后我有一个 python 函数,可以将输入的动物通用名称转换为它的科学名称,以及它能够转换到的分类级别。

例如:熊猫 -> Ailuropoda melanoleuca,物种

下一步我需要帮助,即获取第一个 python 函数的输出,并在 Google 的 BigQuery 上对 pandas 数据框进行查询。下面是表格预览的截图。

下面是我的 main.py 中的 sn-p,它包含查询功能,以及底部的函数调用:

def make_query(taxon, level):
    project_id = "sentinel-system"

    data_frame = pandas_gbq.read_gbq(
        "SELECT * FROM `animal_database.gbif_occurrence` WHERE species=%s LIMIT 10, (taxon)",
        project_id=project_id,
        index_col=level)

    number_of_images = len(data_frame.index)

    credentials = service_account.Credentials.from_service_account_file(
        'Sentinel System-a6746634aad2.json')
    pandas_gbq.context.credentials = credentials
    pandas_gbq.context.project = 'sentinel-system'

    if occurrences > 0:
        print('We found %d images of the animal you searched for!' %(number_of_images))
    else:
        print('Sorry, we couldn''t find any images of the animal you searched for.')
    return 0

taxonomy, level = (common_to_sci('Panda'))
name = taxonomy[-1, -1]
print(name)
print(level)

submission_check = (make_query(name, level))

这个函数的问题是双重的。首先,较小的问题是当前运行 main.py 显示错误

google.api_core.exceptions.BadRequest: 400 Syntax error: Illegal input character "%" at [1:63]

使用 python 元组参数是我从here 学到的解决方案,我不确定这个 SQL 查询应该是什么样子。

第二个更普遍的问题是,我知道 SQL 查询需要引用与我的 BigQuery 表中的列标题中使用的完全相同的字符串。但是如果分类级别不是“物种”而是“属/科/目”呢?对于 'level' != 'species' 的情况,有没有办法让 SQL 查询更通用?

【问题讨论】:

【参考方案1】:

在使用@itroulli 的答案反复试验、阅读他们链接的the documentation 并进行一般调整后,这是对我有用的解决方案。

project_id = "sentinel-system"

table = 'animal_database.gbif_occurrence'

query = 'SELECT * FROM  WHERE =\'\''.format(table, level, taxon)

data_frame = pandas_gbq.read_gbq(query, project_id=project_id)

使用给定的表,SQL 查询搜索要搜索的正确列(由“级别”给出)并在该列下读取由“分类单元”给出的动物学名。

【讨论】:

【参考方案2】:

根据BigQuery documentation 关于pandas_gbq,您应该为参数化查询使用单独的配置变量:

query = "SELECT * FROM `animal_database.gbif_occurrence` WHERE @species=@taxonomy LIMIT 10"

query_config = 
'query': 
    'parameterMode': 'NAMED',
    'queryParameters': [
        
            'name': 'species',
            'parameterType': 'type': 'STRING',
            'parameterValue': 'value': level
        ,
        
            'name': 'taxonomy',
            'parameterType': 'type': 'STRING',
            'parameterValue': 'value': taxon
        
    ]


【讨论】:

感谢您的建议,第一个 表示要查看的表的列,第二个 表示要查找的特定名称(并计算出现次数)吗? 嗨@itroulli,在听从你的建议后,我仍然收到类似的错误pandas_gbq.gbq.GenericGBQException: Reason: 400 Syntax error: Unexpected "" at [1:55]。这是使用标准 SQL 而不是旧版 SQL 的问题,还是我缺少的其他东西?干杯 确实,我错了。我按照文档编辑了我的答案。 谢谢,这无疑让我离我需要的地方更近了,但我对参数@species=@taxonomy 仍然有些困惑。由于“物种”是通过从“级别”(物种、属、科或目)中获取值来选择要查看的列标题,而“分类学”是从“分类单元”中获取动物的学名, '@species=@taxonomy' 是否暗示'在“级别”列中查找“分类单元”动物名称'?目前,运行查询是从 BigQuery 表中下载零行,其中应该至少有一个条目 嗨@itroulli,我找到了一个不同的解决方法,它对我有用。我敢肯定,由于我对 SQL 的缺乏经验,我没有得到您的解决方案,我感谢您在这方面的帮助。我将在新答案中发布我的解决方案

以上是关于根据 Python 函数输出指定的列在 Google BigQuery 上进行查询的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 3 个不同的列在 mysql 中选择行

使用表中的列在 PostgreSQL 中创建视图

如何根据列在火花中重新分区?

Access VBA:根据非绑定列在组合框中查找项目

print函数各输出项之间用啥进行隔开

如何使用 Python 根据数据集的列查找动态函数的根