2015-12-30 5 views
2

Вот мой мистерий. На консоли, когда я вычислить этот запрос, он работает отлично:mystery on BigQuery views

SELECT rd.ds_id AS ds_id 
FROM (SELECT ds_id, 1 AS dummy FROM bq_000010.table) rd 
    INNER JOIN EACH (SELECT 1 AS dummy) cal ON (cal.dummy = rd.dummy); 

Затем я сохранить его как вид называется dataset.myview и выполнить команду:

SELECT * FROM dataset.myview LIMIT 1000 

Но возникает следующее сообщение об ошибке :

SELECT query which references non constant fields or uses aggregation functions or has one or more of WHERE, OMIT IF, GROUP BY, ORDER BY clauses must have FROM clause.

тем не менее, когда я пытаюсь: SELECT * FROM dataset.myview, то есть без LIMIT, это работает !!

И в самом деле, когда я запускаю мой полный запрос с LIMIT на дне, оно также вызывает ошибку:

SELECT rd.ds_id AS ds_id 
FROM (SELECT ds_id, 1 AS dummy FROM bq_000010.table) rd 
    INNER JOIN EACH (SELECT 1 AS dummy) cal ON (cal.dummy = rd.dummy) LIMIT 1000; 

Тем не менее, когда я добавляю внутренний ORDER BY, он вычисляет выздоровел:

SELECT rd.ds_id AS ds_id 
FROM (SELECT ds_id, 
      1 AS dummy 
     FROM bq_000010.000010_flux_visites_ds 
     ORDER BY ds_id) rd 
    INNER JOIN EACH (SELECT 1 AS dummy) cal ON (cal.dummy = rd.dummy) LIMIT 1000 
+1

Что произойдет, если вы примените заказ по своему выбору на вид? или вам нужны случайные результаты? [Запрос с предложением LIMIT может все еще быть недетерминированным, если в запросе нет оператора, который гарантирует упорядочение выходного результирующего набора. Это связано с тем, что BigQuery выполняется с использованием большого числа параллельных рабочих. Порядок, в котором возврат параллельных заданий не гарантируется.] (Https://cloud.google.com/bigquery/query-reference?hl=ru#limit). Примечание: это не представление, а выбор для представления. – xQbert

+0

Я обновил свой пост, но я не понимаю, что происходит. – sweeeeeet

+1

Я сам не уверен. Обычно странно видеть лимит без какого-либо заказа; поэтому я спросил о заказе. *** полный SWAG *** заключается в том, что, возможно, параллельные работники завершают внешнее соединение и лимит перед тем, как внутренний выбор завершится, вызывая внутреннюю ошибку; и, применяя заказ системой, принудительно материализует запись перед выполнением внутреннего соединения соединения. Но у меня действительно есть ~~ NO CLUE ~~ – xQbert

ответ

1

Что произойдет, если вы примените заказ по своему выбору на вид? или вам нужны случайные результаты?

A query with a LIMIT clause may still be non-deterministic if there is no operator in the query that guarantees the ordering of the output result set. This is because BigQuery executes using a large number of parallel workers. The order in which parallel jobs return is not guaranteed.

Я не знаю, почему заказ на здесь будет иметь значение. Однако, как правило, странно видеть лимит без какого-либо заказа; поэтому я спросил о заказе. Полный SWAG состоит в том, что, возможно, параллельные работники завершают внешнее соединение и лимит перед тем, как внутренний выбор завершится, вызывая внутреннюю ошибку; и, применяя заказ системой, принудительно материализует запись перед выполнением внутреннего объединения соединения.

Но у меня действительно есть ~~ NO CLUE ~