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在什么条件下展平结果?
答案 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,但到目前为止我还没有得到完整的解释。