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