Большой запрос обновляет структуру до нуля в повторном поле - PullRequest
0 голосов
/ 18 декабря 2018

В Google BigQuery я пытаюсь сделать обновление для повторяющегося поля.

Для сравнения, это работает (или, по крайней мере, помечено как действительное), но, конечно, фактически не обновляетполе.

UPDATE my.table t
SET my_field = ARRAY(
  SELECT AS STRUCT g.foo, g.bar, g.struct_to_set_null
  FROM unnest(t.groups) as g
), ... FROM ... etc

Установка struct_to_set_null на ноль дает ошибку:

UPDATE my.table t
SET my_field = ARRAY(
  SELECT AS STRUCT g.foo, g.bar, null as struct_to_set_null
  FROM unnest(t.groups) as g
), ... FROM ... etc

Value of type ARRAY<STRUCT<... (really long and cut off) cannot be assigned to groups, which has type <ARRAY,STRUCT<... (same, really long, cut off)

Я вижу, чтополе, о котором идет речь, имеет тип RECORD и NULLABLE, поэтому я думаю, что его установка на null разрешена.Есть ли хитрость, чтобы заставить это работать?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Проблема в том, что BigQuery не выводит тип поля структуры только из литерала NULL;Вы должны быть немного более явным.Вот пример:

CREATE TABLE tmp_elliottb.UpdateTable (
  my_field ARRAY<STRUCT<foo INT64, bar INT64, struct_to_set_null STRUCT<x STRING, y BOOL, z INT64>>>
);

UPDATE tmp_elliottb.UpdateTable
SET my_field = ARRAY(
  SELECT AS STRUCT foo, bar, NULL AS struct_to_set_null FROM UNNEST(my_field)
)
WHERE true;

Это дает мне:

Value of type ARRAY<STRUCT<foo INT64, bar INT64, struct_to_set_null INT64>> cannot be assigned to my_field, which has type ARRAY<STRUCT<foo INT64, bar INT64, struct_to_set_null STRUCT<x STRING, y BOOL, z INT64>>> at [4:16]

Вместо этого я могу использовать выражение IF, которое производит NULL, но имеет struct_to_set_null в одной из ветвей, чтобы принудительно указать желаемый тип вывода:

UPDATE tmp_elliottb.UpdateTable
SET my_field = ARRAY(
  SELECT AS STRUCT
    foo, bar,
    IF(false, struct_to_set_null, NULL) AS struct_to_set_null 
  FROM UNNEST(my_field)
)
WHERE true;

Или, альтернативно, я могу использовать SELECT * REPLACE:

UPDATE tmp_elliottb.UpdateTable
SET my_field = ARRAY(
  SELECT AS STRUCT * REPLACE (IF(false, struct_to_set_null, NULL) AS struct_to_set_null )
  FROM UNNEST(my_field)
)
WHERE true;
0 голосов
/ 18 декабря 2018

Repeated является типом Array, поэтому его нельзя установить на NULL.

В настоящее время BigQuery имеет два следующих ограничения в отношении NULL s и ARRAYs:

  • BigQuery вызывает ошибку, если в результате запроса есть ARRAYs, который содержит NULL элементов, хотя такие ARRAYs могут использоваться внутри запроса.
  • BigQuery переводит NULL ARRAYв пустой ARRAY в результате запроса, хотя внутри запроса NULL и пустого ARRAYs есть два разных значения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...