Выполнение запроса в Google BigQuery в зависимости от столбца, указанного в выводе функции Python - PullRequest
0 голосов
/ 05 мая 2020

У меня есть простая HTML страница, на которой пользователя просят ввести и указать имя животного по своему выбору. Затем у меня есть функция python, которая преобразует введенное общее имя животного в его научное c имя, и в какой уровень таксономии оно могло преобразоваться.

Например: Panda -> Ailuropoda melanoleuca, разновидность

Мне нужна помощь на следующем шаге, который заключается в получении выходных данных этой первой функции python и выполнении запроса в pandas фрейм данных в Google BigQuery. Ниже приведен снимок экрана предварительного просмотра таблицы.

enter image description here

Ниже приведен фрагмент моего файла main.py, который включает функцию создания запросов и вызовы функций внизу:

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 - это решение, которое я узнал из здесь , и я Не уверен, как должен выглядеть этот запрос SQL.

Вторая, более общая проблема заключается в том, что я понимаю, что запрос SQL должен ссылаться на ту же строку, которая используется в заголовке столбца в моем BigQuery стол. Но что, если бы уровень таксономии был не «вид», а «род / семейство / порядок»? Есть ли способ сделать запрос SQL более универсальным для случаев, когда 'level'! = 'Sizes'?

Ответы [ 2 ]

1 голос
/ 06 мая 2020

После проб и ошибок с использованием ответа @ itroulli, чтения документации , которую они связали, и общей настройки, это было решение, которое сработало для меня.

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 выполняет поиск нужного столбца для поиска (заданного параметром «level»), а под этим столбцом читает научное c имя животного, заданное параметром «taxon».

0 голосов
/ 05 мая 2020

Согласно документации BigQuery относительно 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}
        }
    ]
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...