pandas-gbq当前是否支持参数化查询?

时间:2019-12-17 11:50:41

标签: python pandas google-bigquery

我需要使用Pandas / pandas-gbq在Python中创建一个简单的ETL管道,读取给定日期范围内从BigQuery到Pandas数据框的每一天,并根据查询结果创建单独的每日表格(写回BigQuery)。

尽管可能会有更好,更有效的方法(注意:我不是软件工程师),但我目前正在使用BigQuery中的Parameterized Queries来参数化日期列,并在for循环中对其进行迭代蟒蛇。

有人知道pandas-gbq当前是否支持参数化查询?预先感谢。

3 个答案:

答案 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'}
            },
        ]
    }
}

我认为这将帮助我们大多数人寻求解决问题的方法。