我上周才开始使用新的 Google Cloud Datalab 和 IPython(尽管我已经使用 BigQuery 几个月了)。github 中的教程和示例非常有用,但是随着我的脚本和查询变得更加复杂,我想知道一些事情。第一个是这样的:我可以在后面的 %%sql 模块中引用一个 %%sql 模块中定义的查询吗?另一个有点相关的问题是,我能否以某种方式存储来自一个 %%sql 模块的结果,然后将该信息放入后续 %%sql 模块中的 IN 子句之类的东西中?
1 回答
这里有一些东西可以尝试,看看它们是否满足您的需求。如果他们不这样做,我欢迎您在 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 模块在幕后变成了自动导入的 python 模块。
我曾经自己拆分每个 %%sql 单元格的查询,但是自从引入模块以来,我还根据场景在单个模块中定义多个查询,您不需要将一些 python 代码拼接在一起。取决于你的场景,哪个更好。
对于第二个问题,如果查询是跨单元拆分的,则中间需要一些 python 胶水。执行一个查询,获取其结果,并将其用作下一个查询的参数。这适用于一般标量值,但对于 IN 子句和元组/值列表,我们需要解决这个问题:https ://github.com/GoogleCloudPlatform/datalab/issues/615
有关如何在 BigQuery 中使用 JOIN 在下一个查询中使用的查询中生成标量结果的更多想法,您还可以在标题为“SQL 查询组合”的 BigQuery 教程笔记本中的第 3 步下查看查询。
希望有帮助。
如前所述,如果您遇到了某些未按预期工作的特定问题,请提交问题,我们可以看看解决它是否有意义,并且您或其他人甚至可能会加紧做出贡献。:)