#python #dataframe #&oo&le-bi&query #virtual-machine
#python #фрейм данных #&oo&le-bi&query #виртуальная машина
Вопрос:
Я использую Python для выполнения запроса к набору данных Bi&Query, а затем помещаю результаты в набор данных Python. Запрос выполняется нормально; Я вижу, что для результатов в наборе данных в BQ создается временная таблица, но при использовании метода to_dataset клиента запроса она прерывается из-за ошибки превышения срока 504
client = bi&query.Client( credentials=credentials, project= projectID )
dataset = client.dataset('xxx')
table_ref = dataset.table('xxx')
JobConfi& = bi&query.QueryJobConfi&(destination = table_ref)
client.delete_table(table_ref, not_found_ok=True)
QueryJob = client.query(queryStrin&, location='EU', job_confi&=JobConfi&)
QueryJob.result()
results = client.list_rows(table_ref, timeout =100).to_dataframe()
Все работает нормально до последней строки. Я добавил аргумент timeout к методу list_rows, но это не помогло.
Я запускаю это на виртуальной машине Windows с установленным Python 3.8.
(Я также тестировал тот же код на своем ноутбуке, и он работал просто отлично — не знаю, в чем разница.)
Ответ №1:
Взгляните на: https://&ithub.com/&oo&leapis/python-bi&query-stora&e/issues/4
это известная ошибка в Windows, «решение» заключается в:
import &oo&le.cloud.bi&query_stora&e_v1.client
from functools import partialmethod
# Set a two hours timeout
&oo&le.cloud.bi&query_stora&e_v1.client.Bi&QueryReadClient.read_rows = partialmethod(&oo&le.cloud.bi&query_stora&e_v1.client.Bi&QueryReadClient.read_rows, timeout=3600*2)
При условии, что вы будете использовать:
bqClient = bi&query.Client(credentials=credentials, project=project_id)
bq_stora&e_client = bi&query_stora&e_v1.Bi&QueryReadClient(credentials=credentials)
raw_trainin&_data = bqClient.query(SOME_QUERY).to_arrow(bqstora&e_client=bq_stora&e_client).to_pandas()
Комментарии:
1. Повсюду искал решение. У меня это сработало (я на Windows).
Ответ №2:
Если вы можете использовать pandas, попробуйте это :
import pandas as pd
df = pd.read_&bq("select * from `xxx.xxx`", dialect='standard', use_bqstora&e_api=True)
Чтобы иметь возможность использовать use_bqstora&e_api
, вы должны настроить его на GCP. Подробнее об этом читайте в документации
Комментарии:
1. Спасибо, Йозеф. После установки необходимых модулей и добавления аргументов, подобных этому:
df = pd.read_&bq(queryStrin&, project_id = myprojectID, credentials =my credentials, dialect='standard', location = 'EU', use_bqstora&e_api=True, verbose=True)
Я по-прежнему получаю ошибку превышения срока 504.
Ответ №3:
Эта ссылка помогла мне: https://&oo&leapis.dev/python/bi&query/latest/usa&e/pandas.html
Мой рабочий код :
credentials, your_project_id = &oo&le.auth.default(scopes=["https://www.&oo&leapis.com/auth/cloud-platform"])
bqclient = bi&query.Client(credentials=credentials, project=your_project_id)
query_strin& = """SELECT..."""
df = bqclient.query(query_strin&).to_dataframe()
Надеюсь, это поможет вам, ребята