使用python运行大型查询

时间:2019-02-19 09:59:11

标签: python google-bigquery

我正在编写一个python函数,该函数对BigQuery表运行查询并将结果写到另一个表中,这是我的函数,带有一个小的查询:

if (result.isEmpty())

这可以按预期工作,但是当我用实际查询运行它(这会占用更多的内存)时,我正在按def generate_user_pit(days_ago): ### Generate a user facts table for x days ago and save it into BigQuery days_ago = days_ago query = """ SELECT Date, sum(totals.visits) FROM `project.dataset.ga_sessions_20*` AS t WHERE parse_DATE('%y%m%d', _table_suffix) BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL @days_ago day) AND DATE_SUB(CURRENT_DATE(), INTERVAL @days_ago day) GROUP BY Date """ query_params = [ bigquery.ScalarQueryParameter('days_ago', 'INT64', days_ago), ] job_config = bigquery.QueryJobConfig() job_config.query_parameters = query_params job_config.write_disposition = 'WRITE_TRUNCATE' print("Generating dataframe...") df = client.query(query, job_config=job_config).to_dataframe() date = df['Date'].max() table_name = "data_" complete_table_name = table_name + date dataset_ref = client.dataset('test') table_ref = dataset_ref.table(complete_table_name) print("Writing", complete_table_name, "to BigQuery...") client.load_table_from_dataframe(df, table_ref).result() print("Done!")

我可以做些什么来改善此功能并使它更有效吗?例如,我不需要将查询写入数据框,这就是我现在能够使其运行的方式。

这是我返回的查询,它占用了最大内存:

Memory Error

1 个答案:

答案 0 :(得分:0)

您可以至少尝试以下选项:  -将查询结果写入外部文件然后导出  -将查询与结果分页一起使用并循环执行 至于Python优化,您可以尝试,但是如果结果大于系统中的内存,则需要早晚尝试另一种方法。这完全取决于如何使用检索到的数据,但是在您的情况下,我认为带分页的查询将是最好的方法。看一下有关分页的以下答案: What is the best way to paginate results in SQL Server