删除 Google Cloud Datalab SQL 模块参数中的引号?

Posted

技术标签:

【中文标题】删除 Google Cloud Datalab SQL 模块参数中的引号?【英文标题】:Remove quote marks in Google Cloud Datalab SQL module parameters? 【发布时间】:2015-12-15 12:01:58 【问题描述】:

datalab github 存储库(位于 datalab/tutorials/BigQuery/ 下)的“SQL 参数”IPython 笔记本中的参数化示例显示了如何更改 WHERE 子句中正在测试的值。

%%sql --module get_data
SELECT *
FROM
    [myproject:mydataset.mytable]
WHERE
    $query

但是,这种语法似乎总是在参数周围插入引号。当我传递不仅仅是一个简单值的参数时,这会中断:

import gcp.bigquery as bq
query = "(bnf_code LIKE '1202%') OR (bnf_code LIKE '1203%')"
query = bq.Query(get_data, query=query)

print query.sql

这会打印一个无效的查询:

SELECT * FROM [myproject:mydataset.mytable]
WHERE "(bnf_code LIKE '1202%') OR (bnf_code LIKE '1203%')"

有什么方法可以插入没有用引号括起来的值?

我在我的代码中反复使用该模块,在查询参数中使用可变数量的 OR 子句。所以我确实需要一种方法来传递更复杂的查询。

【问题讨论】:

【参考方案1】:

抱歉,变量是用于 IN 子句的简单标量、表或(很快)列表。它们不是用来表达的。

【讨论】:

Datalab 是否有相关的公共问题跟踪器可以提交功能请求?就如何将变量模板化到查询中而言,这似乎是 Datalab 问题,而不是 BigQuery 问题,对吗? Plus-1 用于有一个可以归档的问题跟踪器。 @Pentium10 我已经通过将查询设为 Python 字符串而不是子模块来解决它,然后只使用不带变量的 bq.Query(query_string) 调用它。虽然很乱。 但是,由于这是设计使然,提交问题不会有太大作用。 Richard,下一个版本将支持列表(代码已经在 main 中)。【参考方案2】:

将不带引号的参数传递给 SQL 模块 是不可能的,但可以使用字符串形式的直接 SQL 创建 datalabs.data.SQLStatement。有了它,您可以使用自己的 Python 风格的占位符来替换您认为合适的值:

import datalab.data._sql_statement as bqsql
statement = bqsql.SqlStatement(
    "SELECT some-field FROM %s" % '[your-instance:some-table-name]')
query = bq.Query(statement)

我不知道他们是否对占位符或笔记本内的命令处理做了什么特别的事情,但是......好吧,我在我的(诚然有限的)探索中没有看到任何这些。

【讨论】:

以上是关于删除 Google Cloud Datalab SQL 模块参数中的引号?的主要内容,如果未能解决你的问题,请参考以下文章

通过 Cloud Datalab 加入 Google BigQuery

Google Cloud Datalab 中的 BigQuery - 获取查询文本?

Google Cloud datalab 查询 BIgQuery 表时出错

如何在 Google Cloud Datalab 中使用 Bigquery JSON 函数

如何快速从 Google Cloud Datalab 笔记本中获取数据?

使用 Google Cloud Datalab 时如何将 .gz 文件加载到 BigQuery?