根据 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 上进行查询的主要内容,如果未能解决你的问题,请参考以下文章