1

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

4

1 回答 1

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 步下查看查询。

希望有帮助。

如前所述,如果您遇到了某些未按预期工作的特定问题,请提交问题,我们可以看看解决它是否有意义,并且您或其他人甚至可能会加紧做出贡献。:)

于 2015-11-08T09:46:54.500 回答