BigQuery中的隐式展平

时间:2016-01-25 23:20:19

标签: google-bigquery

BigQuery何时展平中间结果集?我的印象是,仅在调用FLATTEN时,我才遇到一个示例,其结果是在没有FLATTEN的情况下展平。

就是这种情况 - 这个基本查询返回一条记录:

select count(*) from publicdata:samples.trigrams 
where ngram = 'der Griindung im'
+-----+
| f0_ |
+-----+
|   1 |
+-----+

查询时,您可以看到记录中有重复的字段重复两次。

select * from publicdata:samples.trigrams 
where ngram = 'der Griindung im'
+------------------+-------+-----------+-------+--------+-------+------------+-------------------+----------------------+-----------------+------------------+----------------+------------------+-------------------+----------------------+---------------------+-----------------+
|      ngram       | first |  second   | third | fourth | fifth | cell_value | cell_volume_count | cell_volume_fraction | cell_page_count | cell_match_count | cell_sample_id | cell_sample_text | cell_sample_title | cell_sample_subtitle | cell_sample_authors | cell_sample_url |
+------------------+-------+-----------+-------+--------+-------+------------+-------------------+----------------------+-----------------+------------------+----------------+------------------+-------------------+----------------------+---------------------+-----------------+
| der Griindung im | der   | Griindung | im    | NULL   | NULL  | 2007       |                54 | 0.008746355685131196 |              54 |               54 | NULL           | NULL             | NULL              | NULL                 | NULL                | NULL            |
| der Griindung im | der   | Griindung | im    | NULL   | NULL  | 2008       |                47 | 0.007612568837058633 |              47 |               47 | NULL           | NULL             | NULL              | NULL                 | NULL                | NULL            |
+------------------+-------+-----------+-------+--------+-------+------------+-------------------+----------------------+-----------------+------------------+----------------+------------------+-------------------+----------------------+---------------------+-----------------+

当我在cell.value上添加一个过滤器时,我得到两个记录而不是一个 - 但我从来没有弄平,所以我不确定这里的行为。我的期望是,这将返回与上一个COUNT相同的输出。它没有:

select count(*) from publicdata:samples.trigrams 
where ngram = 'der Griindung im' and cell.value in ('2007', '2008')
+-----+
| f0_ |
+-----+
|   2 |
+-----+

这意味着,虽然我希望select * from publicdata:samples.trigrams where ngram = 'der Griindung im'select * from publicdata:samples.trigrams where ngram = 'der Griindung im' and cell.value in ('2007', '2008')返回相同的输出,但它们并不是因为一个是隐式展平而另一个不是。虽然这可能看起来不是一个大问题,但如果它是嵌套查询的一部分,预期中间结果会被展平或重复,那么这可能会非常重要。

在没有明确FLATTEN的情况下,BigQuery在什么条件下展平结果?

2 个答案:

答案 0 :(得分:1)

我先回答一下,在这种情况下如何得到正确的计数:

所以而不是

SELECT COUNT(*) 
FROM [publicdata:samples.trigrams] 
WHERE ngram = 'der Griindung im' 
AND cell.value IN ('2007', '2008')

结果

+-----+
| f0_ |
+-----+
|   2 |
+-----+

你应该做

SELECT COUNT(*) 
FROM [publicdata:samples.trigrams] 
WHERE ngram = 'der Griindung im' 
OMIT RECORD IF EVERY(cell.value NOT IN ('2007', '2008'))

结果

+-----+
| f0_ |
+-----+
|   1 |
+-----+

因为我认为你的期望

其次 - Under what conditions does BigQuery flatten results without an explicit FLATTEN?

我认为(只是我的猜测基于BQ行为观察)每次在SELECT或WHERE等子句中明确引用记录的字段时,它会自动为您展平。使用FLATTEN运算符有助于控制"这个流程。

答案 1 :(得分:1)

短篇小说:使用count(0)代替count(*)。 (您得到1而不是2。)

count(*)对重复的字段表现得很奇怪。看起来结果是扁平的,但如果确实如此,这也会影响count(0)。我已经问过这个here,但到目前为止我还没有得到完整的解释。