BigQuery выберите ожидаемый двойной вложенный столбец - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь удалить столбец из таблицы BigQuery, и я следовал инструкциям, указанным здесь:

https://cloud.google.com/bigquery/docs/manually-changing-schemas#deleting_a_column_from_a_table_schema

Это не сработало напрямую как столбец I 'Я пытаюсь удалить вложенный дважды в структуре.Следующие вопросы SO актуальны, но ни один из них не решает этот конкретный случай.

  1. Одно вложенное поле: Выбор BigQuery *, кроме вложенного столбца

  2. Двойное вложенное поле (решение имеет все поля в перечисленной схеме, что для меня бесполезно, поскольку моя схема огромна): BigQuery: выберите * заменить из нескольких вложенных столбцов

Я пытался адаптировать вышеупомянутые решения, и я думаю, что я близок, но не могу заставить его работать.

Это удалит поле, но возвращает тольковложенное поле, а не вся таблица (примеры, которые я хочу удалить a.b.field_name. См. пример схемы в конце):

SELECT AS STRUCT * EXCEPT(a), a.* REPLACE (
    (SELECT AS STRUCT a.b.* EXCEPT (field_name)) AS b
)
FROM `table`

Следующая попытка выдает ошибку: Scalar subquery produced more than one element:

WITH a_tmp AS (
    SELECT AS STRUCT a.* REPLACE (
        (SELECT AS STRUCT a.b.* EXCEPT (field_name)) AS b
    ) 
    FROM `table`
)

SELECT * REPLACE (
    (SELECT AS STRUCT a.* FROM a_tmp) AS a
)
FROM `table`

Есть ли обобщенный способ решения этой проблемы?Или я вынужден использовать перечисленное решение во 2-й ссылке?

Пример схемы:

[
    {
        "name": "a",
        "type": "RECORD",
        "fields": [
            {
                "name": "b",
                "type": "RECORD"
                "fields": [
                    {
                        "name": "field_name",
                        "type": "STRING"
                    },
                    {
                        "name": "other_field_name".
                        "type": "STRING"
                    }
                ]
            },
        ]
    }
]

Я бы хотел, чтобы окончательная схема была такой же, но без field_name.

1 Ответ

0 голосов
/ 22 октября 2018

Ниже для BigQuery Standard SQL

#standardSQL
SELECT * REPLACE(
  (SELECT AS STRUCT(SELECT AS STRUCT a.b.* EXCEPT (field_name)) b)
  AS a) 
FROM `project.dataset.table`  

вы можете протестировать, поиграть с ним, используя фиктивные данные, как показано ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT STRUCT<b STRUCT<field_name STRING, other_field_name STRING>>(STRUCT('1', '2')) a
)
SELECT * REPLACE(
  (SELECT AS STRUCT(SELECT AS STRUCT a.b.* EXCEPT (field_name)) b)
  AS a) 
FROM `project.dataset.table`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...