如何在 Jupyter/Colab 的全单元魔术命令中传递变量?

Posted

技术标签:

【中文标题】如何在 Jupyter/Colab 的全单元魔术命令中传递变量?【英文标题】:How to pass a variable in a full cell magic command in Jupyter/Colab? 【发布时间】:2021-12-02 01:20:05 【问题描述】:

我的代码使用 SQL 来查询 BigQuery 中托管的数据库。假设我有一个存储在变量中的项目列表:

list = ['a','b','c']

我想将该列表用作这样的查询的参数:

%%bigquery --project xxx query

SELECT *
FROM `xxx.database.table`
WHERE items in list

由于调用数据库的魔术命令是全单元格命令,我怎样才能进行一些转义以使其调用SQL查询中的环境变量?

【问题讨论】:

【参考方案1】:

你可以试试UNNEST,BIGQUERY 中的查询是这样的:

SELECT * FROM `xx.mytable` WHERE items in UNNEST (['a','b','c']) 

在您的代码中应该如下所示:

SELECT * FROM `xx.mytable` WHERE items in UNNEST (list)

编辑

我发现了两种在 Python 中传递变量的不同方法。

第一种方法如下。来自谷歌文档[1]。

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

query = """
    SELECT * FROM `xx.mytable` WHERE items in UNNEST (@list)
 """
job_config = bigquery.QueryJobConfig(
    query_parameters=[
        bigquery.ArrayQueryParameter("list", "STRING", ["a", "b", "c"]),
    ]
)
query_job = client.query(query, job_config=job_config)  # Make an API request.

for row in query_job:
    print(": \t".format(row.name, row.count))

第二种方法在下一个文档中[2]。在您的代码中应如下所示:

params = 'list': '[“a”,”b”,”c”]'
%%bigquery df --params $params --project xxx query
select * from `xx.mytable` 
where items in unnest (@list)

我还找到了一些文档[3],其中显示了 %%bigquery 魔术的参数。

[1]https://cloud.google.com/bigquery/docs/parameterized-queries#using_arrays_in_parameterized_queries [2]https://notebook.community/GoogleCloudPlatform/python-docs-samples/notebooks/tutorials/bigquery/BigQuery%20query%20magic [3]https://googleapis.dev/python/bigquery/latest/magics.html

【讨论】:

从 Colab 内部,它无法识别该变量。查询执行:0.36s 错误:400 无法识别的名称:列表 [8:25] @MarceloSoares 我找到了一些关于如何传递变量的文档,如果这对你有帮助,请告诉我。 让我测试一下。我昨天第一种方法已经解决了,午饭后我会检查第二种方法(看起来更优雅)。 绝对有效!非常感谢。

以上是关于如何在 Jupyter/Colab 的全单元魔术命令中传递变量?的主要内容,如果未能解决你的问题,请参考以下文章

更改同一单元格中的魔术标签 - Azure Databricks

单元测试魔术方法

如何将表格样式设置为容器的全宽并使单元格使用宽度的百分比?

在另一个翻译单元的静态破坏阶段引用时,“魔术静态”单例崩溃

%matplotlib 内联魔术命令无法从 AWS-EMR Jupyterhub Notebook 中的先前单元格读取变量

Jupyter:魔术 %qtconsole 不起作用