是否可以在后面的模块中引用前面 %%sql 模块中定义的查询?

is it possible to refer to queries defined in a previous %%sql module in a later module?

上周我刚刚开始使用新的 Google Cloud Datalab 和 IPython(尽管我已经使用 BigQuery 几个月了)。 github 中的教程和示例非常有用,但随着我的脚本和查询变得越来越复杂,我想知道一些事情。第一个是这样的:我可以在后面的 %%sql 模块中引用一个 %%sql 模块中定义的查询吗?另一个有点相关的问题是,我能否以某种方式存储来自一个 %%sql 模块的结果,然后将该信息放入类似 IN 子句的后续 %%sql 模块中?

这里有一些可以尝试的东西,看看它们是否满足您的需求。如果他们不这样做,我欢迎您在 github 中提出问题,因为我认为您的两种情况都是我们想要确保正常工作的事情。

首先,它需要 sql 个单元格和代码单元格的组合 [暂时]

单元格 1

%%sql --module m1
DEFINE QUERY q1 
SELECT ...

单元格 2

%%sql --module m2
DEFINE QUERY q2
SELECT ... FROM $src ...

单元格 3

import gcp.bigquery as bq

compositequery = bq.Query(m2.q2, src = m1.q1)

本质上,%%sql 模块在幕后变成了 auto-imported python 模块。

我曾经自己将查询拆分为每个 %%sql 单元格,但自从引入模块后,我也根据场景,在一个模块中定义多个查询,您不需要一些 python 代码拼接在一起。看你的场景,哪个更好

对于你的第二个问题,如果查询跨单元格拆分,你需要在中间添加一些 python 胶水。执行一个查询,获取其结果,并将其用作下一个查询的参数。这适用于一般标量值,但对于 IN 子句和 tuples/lists 值,我们有需要解决的问题:https://github.com/GoogleCloudPlatform/datalab/issues/615

有关如何在 BigQuery 中使用 JOIN 在一个查询中生成标量结果并在下一个查询中使用的更多想法,您还可以在标题为 [=36= 的 BigQuery 教程笔记本中查看第 3 步下的查询].

希望对您有所帮助。

如前所述,如果您遇到特定问题,其中某些内容未按预期工作,请提交问题,我们可以看看是否需要解决,您或其他人甚至可能会加强做出贡献。 :)