我需要使用Pandas/ Pandas -gbq在Python语言中创建一个简单的ETL管道,每天将给定日期范围内的数据从BigQuery读取到Pandas数据帧中,并根据查询结果创建单独的日表(写回BigQuery)。
尽管可能有更好、更有效的方法(注意:我不是软件工程师),但我目前正在研究BigQuery中的Parameterized Queries来参数化日期列,并在Python中的for循环中迭代这一过程。
有人知道pandas-gbq目前是否支持参数化查询吗?提前谢谢。
发布于 2019-12-17 20:02:12
是的,确实如此。然而,我建议你切换到官方的谷歌BigQuery客户端库,它也支持参数。
BigQuery客户端库:https://cloud.google.com/bigquery/docs/reference/libraries#client-libraries-install-python
使用Pandas GBQ设置参数
配置: 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
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发布于 2021-03-21 00:14:01
一种简单的方法是使用.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发布于 2020-06-03 18:54:40
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'}
},
]
}
}我认为这将帮助我们中的大多数人找到问题的解决方案。
https://stackoverflow.com/questions/59373681
复制相似问题