Bigquery 查询计划产生未知输出
Bigquery query plan produce unknown output
我试图更好地理解 BigQuery queryPlan,并尝试使用该 queryPlan 在列级别建立数据沿袭。
一切顺利,READ
、COMPUTE
等……都还算可以理解,然后跨了JOIN
一步。使用一个简单的查询,将两个 table 连接在一个列上,并从两个 table 输出列:
CREATE OR REPLACE TABLE wrk_dataset.t1 AS ( select 1 as t1f1 );
CREATE OR REPLACE TABLE wrk_dataset.t2 AS ( select 1 as t2f1 );
SELECT t1f1 AS t3f1,
t1f1 AS t3f2,
t2f1 AS t3f3,
FROM wrk_dataset.t1
JOIN wrk_dataset.t2
ON t1f1 = t2f1
我在 queryPlan 中得到了这些步骤:
S00: 输入
READ :t2f1
FROM wrk_dataset.t2
WRITE
TO __stage00_output
S02:输出
READ :t1f1
FROM wrk_dataset.t1
READ
FROM __stage00_output
JOIN INNER HASH JOIN EACH WITH ALL ON =
WRITE ,
TO __stage02_output
所以一开始,一切都很好,
</code> 链接到 <code>wrk_dataset.t2.t2f1
</code> 链接到 <code>wrk_dataset.t1.t1f1
- 连接是比较
</code> 和 <code>
的内部散列(所以 wrk_dataset.t1.t1f1
和 wrk_dataset.t2.t2f1
)
然后它变得复杂:该步骤输出 </code> 和 <code>
,但它们的乘积是什么?同样在我的 SELECT
中,我要求 3 列(其中 2 列相同),所以我可以 猜测 </code> 可能是 <code>t1f1
</code> 是 <code>t2f1
但仅通过查看 SELECT
.
是不是像其他框架一样只看计划就知道查询结果?
编辑
所以,显然只是一个简单的 READ
比我想的更难理解。
SELECT id, id FROM ( select 1 as id )
给我那个查询计划:
COMPUTE := 1
WRITE
TO __stage00_output
所以我想我无法通过仅查看 queryPlan 来确定 table 的架构,这将是我的查询结果?
查询计划不可能。发送到最后一步的 $variables
TO __stage00_output
包含要发送到输出的列数据。如果重复,则不会发送多次。它只会在最终输出中显示多次(因为从一步到另一步多次传递相同的信息没有意义。)
如果没有重复的列,可以认为是输出模式的表示,但最好不要使用。查询计划旨在用于通过监视其执行时间等来排除故障并识别查询的瓶颈..
我试图更好地理解 BigQuery queryPlan,并尝试使用该 queryPlan 在列级别建立数据沿袭。
一切顺利,READ
、COMPUTE
等……都还算可以理解,然后跨了JOIN
一步。使用一个简单的查询,将两个 table 连接在一个列上,并从两个 table 输出列:
CREATE OR REPLACE TABLE wrk_dataset.t1 AS ( select 1 as t1f1 );
CREATE OR REPLACE TABLE wrk_dataset.t2 AS ( select 1 as t2f1 );
SELECT t1f1 AS t3f1,
t1f1 AS t3f2,
t2f1 AS t3f3,
FROM wrk_dataset.t1
JOIN wrk_dataset.t2
ON t1f1 = t2f1
我在 queryPlan 中得到了这些步骤:
S00: 输入
READ :t2f1
FROM wrk_dataset.t2
WRITE
TO __stage00_output
S02:输出
READ :t1f1
FROM wrk_dataset.t1
READ
FROM __stage00_output
JOIN INNER HASH JOIN EACH WITH ALL ON =
WRITE ,
TO __stage02_output
所以一开始,一切都很好,
</code> 链接到 <code>wrk_dataset.t2.t2f1
</code> 链接到 <code>wrk_dataset.t1.t1f1
- 连接是比较
</code> 和 <code>
的内部散列(所以wrk_dataset.t1.t1f1
和wrk_dataset.t2.t2f1
)
然后它变得复杂:该步骤输出 </code> 和 <code>
,但它们的乘积是什么?同样在我的 SELECT
中,我要求 3 列(其中 2 列相同),所以我可以 猜测 </code> 可能是 <code>t1f1
</code> 是 <code>t2f1
但仅通过查看 SELECT
.
是不是像其他框架一样只看计划就知道查询结果?
编辑
所以,显然只是一个简单的 READ
比我想的更难理解。
SELECT id, id FROM ( select 1 as id )
给我那个查询计划:
COMPUTE := 1
WRITE
TO __stage00_output
所以我想我无法通过仅查看 queryPlan 来确定 table 的架构,这将是我的查询结果?
查询计划不可能。发送到最后一步的 $variables
TO __stage00_output
包含要发送到输出的列数据。如果重复,则不会发送多次。它只会在最终输出中显示多次(因为从一步到另一步多次传递相同的信息没有意义。)
如果没有重复的列,可以认为是输出模式的表示,但最好不要使用。查询计划旨在用于通过监视其执行时间等来排除故障并识别查询的瓶颈..