【问题标题】:How to pass a parameter into bigquery query on colab如何将参数传递给colab上的bigquery查询
【发布时间】:2022-01-20 22:28:50
【问题描述】:

我有一个关于 colab 的 Bigquery 查询:

from google.colab import auth
auth.authenticate_user()
print('Authenticated')
project_id = '[your project ID]'

sample_count = 2000
df = pd.io.gbq.read_gbq('''
  SELECT name, SUM(number) as count
  FROM `bigquery-public-data.usa_names.usa_1910_2013`
  WHERE state = 'TX'
  AND year BETWEEN 1910 AND 1920
  GROUP BY name
  ORDER BY count DESC
  LIMIT 100
''', project_id=project_id, dialect='standard')

df.head()

它有效,但现在我尝试将参数传递到查询中并替换查询 WHERE 子句中的“1920”。这个参数依赖于另一个文件

end_year = max(record.year) # set end_year

df = pd.io.gbq.read_gbq('''
  SELECT name, SUM(number) as count
  FROM `bigquery-public-data.usa_names.usa_1910_2013`
  WHERE state = 'TX'
  AND year BETWEEN 1910 AND end_year
  GROUP BY name
  ORDER BY count DESC
  LIMIT 100
''', project_id=project_id, dialect='standard')

df.head()

但我得到一个错误:

BadRequest: 400 Syntax error: Unexpected identifier "end_year"

我猜参数没有成功传入查询,但我不知道如何修复它。

【问题讨论】:

    标签: python sql google-bigquery google-colaboratory


    【解决方案1】:

    正如@Mike Karp 所提到的,您代码中的查询是一个字符串,这就是为什么您在将变量直接传递给查询时遇到错误的原因。

    您也可以使用 python 的 f 字符串 来格式化您的字符串并能够在查询中传递变量。

    from google.colab import auth
    import pandas as pd
    auth.authenticate_user()
    print('Authenticated')
    project_id = 'PROJECT_ID'
    
    end_year = max(record.year) # set end_year
    
    query = (f" SELECT name, SUM(number) as count \
      FROM `bigquery-public-data.usa_names.usa_1910_2013` \
      WHERE state = 'TX' \
      AND year BETWEEN 1910 AND {end_year} \
       GROUP BY name \
      ORDER BY count DESC \
      LIMIT 100")
    
    df = pd.io.gbq.read_gbq(query=query, project_id=project_id, dialect='standard')
    
    df.head()
    

    【讨论】:

      【解决方案2】:

      就 python 而言,您传递给 bigquery 的查询是一个字符串,因此它不能调用您的变量。

      像这样:

      end_year = max(record.year) # set end_year
      
      df = pd.io.gbq.read_gbq('''
        SELECT name, SUM(number) as count
        FROM `bigquery-public-data.usa_names.usa_1910_2013`
        WHERE state = 'TX'
        AND year BETWEEN 1910 AND %s
        GROUP BY name
        ORDER BY count DESC
        LIMIT 100
      ''' % (end_year), project_id=project_id, dialect='standard')
      
      df.head()
      

      这里真的很重要——我假设这是您个人为一次性数据分析而运行的脚本,而不是在可能会引起 SQL 注入问题的生产应用程序中使用的代码。

      【讨论】:

        猜你喜欢
        • 2017-03-08
        • 2017-05-28
        • 2018-09-30
        • 1970-01-01
        • 2018-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多