我需要使用Pandas / pandas-gbq在Python中创建一个简单的ETL管道,读取给定日期范围内从BigQuery到Pandas数据框的每一天,并根据查询结果创建单独的每日表格(写回BigQuery)。
尽管可能会有更好,更有效的方法(注意:我不是软件工程师),但我目前正在使用BigQuery中的Parameterized Queries来参数化日期列,并在for循环中对其进行迭代蟒蛇。
有人知道pandas-gbq当前是否支持参数化查询?预先感谢。
答案 0 :(得分:2)
是的,确实如此。但是,我建议您切换到官方的Google BigQuery客户端库,该库也支持参数。
BigQuery客户端库: https://cloud.google.com/bigquery/docs/reference/libraries#client-libraries-install-python
使用Pandas GBQ设置参数
您可以使用configuration
参数在Pandas GBQ查询中设置参数,以引用Pandas GBQ docs:
configuration:dict,作业的可选查询配置参数 处理。例如:
configuration = {‘query’: {‘useQueryCache’: False}}
这是该链接中的完整代码示例,其中描述了如何在Pandas GBQ中参数化查询:
import pandas
sql = """
SELECT name
FROM `bigquery-public-data.usa_names.usa_1910_current`
WHERE state = @state
"""
query_config = {
'query': {
'parameterMode': 'NAMED',
'queryParameters': [
{
'name': 'state',
'parameterType': {'type': 'STRING'}
},
]
}
}
df = pandas.read_gbq(sql, configuration=query_config)
使用BigQuery客户端库设置参数
这是一篇有关从Pandas-GBQ迁移到BigQuery客户端库的出色文章: https://cloud.google.com/bigquery/docs/pandas-gbq-migration
这是一些示例Python代码,我在其中使用官方BQ客户端库在查询中使用参数:
table_name = "my_table"
job_config = bigquery.QueryJobConfig()
# Set the destination table
table_ref = client.dataset(dataset_id).table(table_name)
job_config.destination = table_ref
job_config.write_disposition = 'WRITE_APPEND'
sql = """
SELECT * FROM dataset.table WHERE visit_date = date
"""
query_params = [bigquery.ScalarQueryParameter('date', 'DATE', date)]
job_config.query_parameters = query_params
# Start the query, passing in the extra configuration.
query_job = client.query(
sql,
location='EU',
job_config=job_config) # API request - starts the query
query_job.result() # Waits for the query to finish
答案 1 :(得分:1)
一个简单的方法是使用 .to_dataframe()
df = client.query(query, job_config=job_config).to_dataframe()
请参阅下面的文档。
Download query results to DataFrame
Google Cloud Client Libraries for google-cloud-bigquery
以下是示例代码 -
name = 'John'
project_id = 'bqproject'
dataset_id = 'bqdataset'
table = 'bqtable'
query = """SELECT * FROM `%s.%s.%s` WHERE Name = @name"""%(project_id,dataset_id,table)
job_config = bigquery.QueryJobConfig(
query_parameters=[
bigquery.ScalarQueryParameter("name", "STRING", name),
]
)
df = client.query(query, job_config=job_config).to_dataframe()
df
答案 2 :(得分:0)
Ben P发布的答案需要对 Pandas GBQ 进行一些改进,因为我们得到以下错误:
GenericGBQException:原因:400 POST https://bigquery.googleapis.com/bigquery/v2/projects/my-bigquery/jobs: 缺少查询参数值
重要且缺少的配置参数是:
'parameterValue': {'value': 'TX'}
可以在Running a query with a configuration文档示例中进行检查。
将查询配置保持在一起,我们得到:
query_config = {
'query': {
'parameterMode': 'NAMED',
'queryParameters': [
{
'name': 'state',
'parameterType': {'type': 'STRING'},
'parameterValue': {'value': 'TX'}
},
]
}
}
我认为这将帮助我们大多数人寻求解决问题的方法。