BigQuery поддерживает два диалекта SQL: стандартный SQL (Standard SQL) и наследуемый SQL (Legacy SQL). По умолчанию используется стандартный SQL, который соответствует международным стандартам и предоставляет расширенные возможности анализа данных, включая оконные функции, CTE, подзапросы в операторе FROM и строгую типизацию.
Наследуемый SQL разработан Google и был основным диалектом BigQuery до 2016 года. Он отличается менее строгой типизацией, отсутствием поддержки оконных функций и нестандартным синтаксисом. Его использование не рекомендуется для новых проектов, так как многие современные функции доступны исключительно в стандартном SQL.
Для переключения между диалектами можно использовать параметры интерфейса, директивы в начале запроса (например, #standardSQL) или соответствующие настройки API. Однако рекомендуется использовать только стандартный SQL, так как он получает регулярные обновления и поддержку новых возможностей платформы.
Если проект содержит устаревший код, написанный на наследуемом SQL, стоит рассмотреть его миграцию на стандартный SQL. Google предоставляет утилиты и документацию, облегчающие этот процесс. Это позволит использовать все функции BigQuery на полную мощность и обеспечит совместимость с другими современными инструментами анализа данных.
Какие диалекты SQL доступны в BigQuery на 2025 год
BigQuery поддерживает два SQL-диалекта: Standard SQL и Legacy SQL. Оба доступны, но Google официально рекомендует использовать только Standard SQL.
Standard SQL – это диалект, основанный на ANSI SQL:2011. Он включает поддержку оконных функций, вложенных запросов, CTE (WITH-запросов), аналитических функций, подзапросов в SELECT, и позволяет использовать сложные типы данных: ARRAY, STRUCT. Он также совместим с UDF на JavaScript и SQL, поддерживает JSON-функции, автоматическую схему таблиц и вложенные данные. Все новые функции и улучшения добавляются только в этот диалект.
Legacy SQL – устаревший диалект, унаследованный от Dremel. Он ограничен в поддержке современных функций, не поддерживает стандартные оконные функции и вложенные запросы в SELECT. Поддержка Legacy SQL сохраняется для обратной совместимости, но его использование не рекомендуется в новых проектах. Большинство пользовательских интерфейсов BigQuery (включая консоль Google Cloud) по умолчанию работают со Standard SQL.
Для явного указания диалекта при выполнении запросов через API или CLI используйте параметр useLegacySql. При значении false активируется Standard SQL. В пользовательском интерфейсе переключение диалекта доступно через соответствующую настройку в редакторе запросов.
Рекомендация: при разработке всех новых решений в BigQuery используйте только Standard SQL. Он предоставляет максимум функциональности, лучшую производительность и поддержку всех современных возможностей платформы.
Чем отличается стандартный SQL BigQuery от диалекта Legacy SQL
Структура запросов: В стандартном SQL используются общепринятые конструкции, такие как WITH для CTE, ARRAY и STRUCT для работы с вложенными данными. В Legacy SQL отсутствует поддержка CTE, вложенные типы данных обрабатываются ограниченно, а вложенные SELECT-запросы применяются чаще и менее гибко.
Обработка данных: Стандартный SQL работает с типами ARRAY и STRUCT на уровне языка, позволяя фильтровать, агрегировать и трансформировать вложенные данные без необходимости развертки. Legacy SQL требует использования FLATTEN(), что ведёт к менее читаемому и менее эффективному коду.
Функции: Стандартный SQL поддерживает более широкую библиотеку функций: SAFE_CAST, FORMAT_TIMESTAMP, REGEXP_EXTRACT_ALL и другие, отсутствующие в Legacy SQL. Поддержка регулярных выражений, обработки дат и безопасного преобразования типов в Legacy ограничена или отсутствует.
Соответствие стандартам: Стандартный SQL основан на ANSI SQL:2011 и выше, что обеспечивает переносимость и предсказуемость запросов. Legacy SQL использует собственный проприетарный синтаксис, несовместимый с другими СУБД.
Соединения: В стандартном SQL поддерживаются FULL OUTER JOIN, RIGHT JOIN, а также JOIN USING и NATURAL JOIN. В Legacy SQL отсутствует FULL OUTER JOIN и нет поддержки JOIN USING, что требует дополнительных условий соединения вручную.
Рекомендация: Используйте стандартный SQL для новых проектов и миграции существующих запросов. Он более гибкий, расширяемый и совместим с современными стандартами обработки данных.
Как выбрать нужный диалект при создании запроса в интерфейсе BigQuery
BigQuery поддерживает два диалекта SQL: стандартный SQL (Standard SQL) и устаревший SQL (Legacy SQL). По умолчанию используется Standard SQL, и его рекомендуется применять для всех новых проектов, так как он обеспечивает большую совместимость, поддержку функций ANSI SQL и более широкие возможности работы с JSON, массивами и вложенными структурами.
При создании запроса в интерфейсе BigQuery Console, диалект можно задать прямо в редакторе запросов. Чтобы выбрать диалект, откройте вкладку Query settings (значок шестерёнки в правом верхнем углу редактора) и установите флажок Use Legacy SQL, если требуется использовать устаревший диалект. Если флажок отключён, применяется Standard SQL.
Альтернативный способ – использовать директиву #standardSQL
или #legacySQL
в начале запроса. Например:
#standardSQL
SELECT name FROM `project.dataset.table` WHERE score > 90
Использование директив особенно полезно при запуске сохранённых запросов или скриптов через API и CLI, где нет визуального интерфейса для переключения диалекта.
Убедитесь, что используемые функции и синтаксис соответствуют выбранному диалекту. Например, функции SAFE_CAST
и ARRAY_AGG
поддерживаются только в Standard SQL. Если при выполнении запроса возникают ошибки синтаксиса, проверьте, не включён ли Legacy SQL по ошибке.
Можно ли переключаться между диалектами внутри одного проекта
BigQuery поддерживает два диалекта SQL: стандартный SQL (Standard SQL) и устаревший SQL (Legacy SQL). Переключение между ними осуществляется на уровне запроса, а не проекта. Это означает, что в рамках одного проекта можно использовать оба диалекта, но каждый запрос должен явно указывать нужный диалект или использовать настройки по умолчанию в интерфейсе или API.
- В консоли BigQuery при создании запроса можно вручную выбрать нужный диалект с помощью чекбокса «Use Legacy SQL». По умолчанию используется Standard SQL.
- В скриптах и API переключение происходит через параметр
useLegacySql
. Для Standard SQL устанавливается значениеfalse
, для Legacy SQL –true
. - При использовании клиентских библиотек (например, Python, Java) настройка диалекта производится на уровне конфигурации запроса.
- В сохранённых представлениях (views) фиксируется диалект, использованный при их создании. Если view создано с использованием Legacy SQL, то любые запросы к нему также должны использовать Legacy SQL.
- Материализованные представления поддерживают только Standard SQL, поэтому при их создании выбор диалекта невозможен.
Рекомендуется придерживаться Standard SQL, так как он является основным, поддерживается Google и включает новейшие функции. Использование обоих диалектов в проекте возможно, но требует внимательности при интеграции представлений и написании сложных запросов.
Какие функции и синтаксические конструкции поддерживаются только в Standard SQL
BigQuery Standard SQL предоставляет расширенные аналитические возможности, недоступные в Legacy SQL. Среди них – оконные функции, выражения STRUCT и ARRAY, а также гибкая работа с вложенными данными и функциями обработки строк.
Оконные функции, такие как RANK()
, DENSE_RANK()
, NTILE()
, LAG()
и LEAD()
, позволяют выполнять аналитические вычисления по заданному окну данных. Они необходимы для построения отчетов и сложных аналитических запросов без использования подзапросов или временных таблиц.
Типы данных STRUCT
и ARRAY
поддерживаются только в Standard SQL и позволяют создавать вложенные структуры прямо в запросах. С их помощью удобно моделировать сложные схемы данных, а также эффективно обрабатывать JSON-подобные объекты.
Функции обработки массивов, такие как ARRAY_AGG()
, UNNEST()
, ARRAY_LENGTH()
, ARRAY_TO_STRING()
, отсутствуют в Legacy SQL. Они применяются при агрегации данных в списки и последующей трансформации.
Синтаксис WITH
для Common Table Expressions (CTE) реализован в Standard SQL и обеспечивает модульность запросов, улучшает читаемость и упрощает отладку.
Функция SAFE_CAST()
позволяет безопасно преобразовывать типы данных без генерации ошибок, заменяя потенциальные сбои на NULL
, что критически важно при обработке некачественных источников данных.
Функции работы со строками, такие как REGEXP_EXTRACT_ALL()
, REGEXP_CONTAINS()
, REGEXP_REPLACE()
, поддерживают полноценную работу с регулярными выражениями, в отличие от ограниченного функционала Legacy SQL.
Standard SQL также предоставляет поддержку подзапросов в SELECT
-и WHERE
-блоках, а также конструкции EXCEPT
и INTERSECT
, необходимые для точного сравнения и исключения наборов данных.
Как поведение запросов зависит от выбранного диалекта при работе с UDF и DDL
Выбор диалекта SQL в BigQuery оказывает прямое влияние на работу с пользовательскими функциями (UDF) и операциями данных определения (DDL). При использовании диалекта Standard SQL или Legacy SQL поведение запросов отличается как в плане синтаксиса, так и в реализации специфичных функций. Эти различия важно учитывать при проектировании архитектуры запросов и написании скриптов для автоматизации.
В Standard SQL UDF можно писать только на JavaScript, при этом все параметры должны быть явными, а их типы строго определяются. Legacy SQL допускает использование только встроенных функций, ограничивая гибкость в обработке данных через кастомные скрипты. Важно помнить, что при использовании UDF в Standard SQL часто возникают проблемы с производительностью, особенно при обработке больших объемов данных, поскольку такие функции выполняются в контексте одного узла, в отличие от стандартных SQL-функций, которые могут быть параллельно распределены.
Работа с DDL в обоих диалектах также имеет свои особенности. В Standard SQL поддерживаются более сложные операции, такие как создание таблиц с ключами и ограничениями, что дает больше возможностей для гибкости схемы данных. В Legacy SQL такие операции не поддерживаются, что ограничивает использование этого диалекта для работы с высокоорганизованными структурами данных.
Кроме того, поведение запросов при использовании DDL и UDF в зависимости от диалекта может приводить к различным результатам при обработке ошибочных данных или данных с несоответствиями типов. Например, в Legacy SQL ошибка типа данных часто приводит к неочевидным результатам или полному отказу в выполнении запроса, в то время как Standard SQL обычно сообщает об ошибке более точно, позволяя легче идентифицировать источник проблемы.
Рекомендуется выбирать диалект, исходя из сложности задач. Если задача требует сложной обработки данных с использованием пользовательских функций, а также требует возможности точной настройки структуры таблиц, предпочтительнее использовать Standard SQL. В случае простых операций или работы с уже существующими структурами, Legacy SQL может оказаться более простым выбором, особенно в контексте старых проектов или миграций.
Какие настройки влияют на выбор диалекта при работе с внешними инструментами (например, Python или Data Studio)
При интеграции BigQuery с внешними инструментами, такими как Python или Data Studio, выбор диалекта SQL может зависеть от нескольких ключевых факторов, которые следует учитывать для эффективной работы с данными.
- Параметры настройки подключения: Внешние инструменты обычно предлагают возможность выбрать диалект SQL на этапе конфигурации подключения. В Python, например, библиотека
google-cloud-bigquery
может использовать стандартный SQL или диалект Legacy SQL в зависимости от заданных настроек. При подключении через Data Studio необходимо явно указать диалект, если используется устаревшая версия SQL. - Тип используемых функций: Диалект SQL может влиять на доступность и синтаксис определённых функций. Например, BigQuery Standard SQL поддерживает новые аналитические функции, такие как
ARRAY_AGG
илиSTRING_AGG
, которые недоступны в Legacy SQL. Если внешняя система использует такие функции, предпочтительнее выбирать Standard SQL. - Совместимость с внешними библиотеками и инструментами: В Python часто используются библиотеки для работы с данными, такие как
pandas
илиsqlalchemy
. Эти библиотеки могут требовать использования конкретного диалекта SQL для обеспечения правильной работы с запросами. Например, запросы в Pandas через BigQuery могут быть оптимизированы для работы со Standard SQL. - Поддержка подзапросов и конструкций SQL: Некоторые конструкции SQL, такие как рекурсивные CTE (Common Table Expressions) или оконные функции, поддерживаются только в Standard SQL. Если приложение или инструмент использует такие конструкции, рекомендуется использовать этот диалект для предотвращения ошибок выполнения.
- Параметры безопасности и ограничений: Внешние инструменты могут иметь разные уровни безопасности и ограничений на выполнение запросов. Например, при подключении через API может быть установлен лимит на сложность запросов или время выполнения. В таких случаях использование более оптимизированных конструкций, доступных только в Standard SQL, может повлиять на выбор диалекта.
- Совместимость с предыдущими версиями проектов: Если в проекте уже используются запросы, написанные с применением Legacy SQL, может быть целесообразным продолжить их использование, чтобы избежать необходимости переписывания кода. Однако следует учитывать, что Legacy SQL не поддерживает некоторые новые функции и улучшения BigQuery.
В итоге, выбор диалекта SQL при работе с BigQuery через внешние инструменты зависит от потребностей в функциональности, совместимости с библиотеками и особенностей конфигурации подключения. Рекомендуется использовать Standard SQL, если нет строгих ограничений, так как он предлагает более широкий набор возможностей и лучшую производительность.
Вопрос-ответ:
Какие диалекты SQL поддерживает BigQuery?
BigQuery использует диалект SQL, который называется «Standard SQL». Он основан на ANSI SQL, но также включает дополнительные возможности, оптимизированные для работы с большими объемами данных. В BigQuery также доступен «Legacy SQL», который является более старой версией SQL, используемой в ранних версиях системы, но он устарел и не рекомендуется для новых проектов.
Что такое Standard SQL в BigQuery и чем он отличается от Legacy SQL?
Standard SQL в BigQuery — это основной диалект SQL, который соответствует стандартам ANSI SQL, но также включает специфические расширения для работы с большими данными. Он поддерживает такие функции, как оконные функции, подзапросы и работы с JSON. В отличие от него, Legacy SQL — это старая версия SQL, которая использовалась до внедрения Standard SQL. Legacy SQL имеет собственные особенности синтаксиса и не поддерживает многие современные функции.
Можно ли использовать Legacy SQL в BigQuery и когда это нужно?
Да, в BigQuery можно использовать Legacy SQL, но это не рекомендуется для новых проектов. Legacy SQL сохраняет совместимость с более старыми запросами и некоторыми устаревшими методами работы с данными. Однако, он не поддерживает многие улучшения и функции, доступные в Standard SQL, такие как более гибкая работа с типами данных или поддержка оконных функций. Лучше использовать Standard SQL, если проект не зависит от старых реалий.
Как перейти с Legacy SQL на Standard SQL в BigQuery?
Для перехода с Legacy SQL на Standard SQL в BigQuery достаточно при написании запроса указать в настройках опцию использования Standard SQL. В интерфейсе BigQuery в консоли Google Cloud можно выбрать нужный диалект SQL, а в командной строке можно использовать флаг `—use_legacy_sql=false` для того, чтобы запросы выполнялись в Standard SQL. Перевод запросов может потребовать изменения синтаксиса, поскольку Legacy SQL и Standard SQL используют разные подходы к работе с данными.
Какие преимущества предоставляет использование Standard SQL в BigQuery?
Использование Standard SQL в BigQuery дает несколько преимуществ, таких как более гибкая и мощная работа с типами данных, поддержка современных SQL-функций, например, оконных функций и CTE (Common Table Expressions). Standard SQL также позволяет использовать стандартные конструкции ANSI SQL, что упрощает миграцию между различными СУБД. Он оптимизирован для работы с большими объемами данных и помогает создавать более сложные и производительные запросы. В целом, использование Standard SQL помогает избежать ограничений и устаревших практик Legacy SQL.
Сколько диалектов SQL поддерживает BigQuery?
BigQuery поддерживает два основных диалекта SQL: стандартный SQL и Legacy SQL. Стандартный SQL является предпочтительным вариантом и более современным, с полным набором функций для работы с данными. Legacy SQL используется для совместимости с более старыми запросами и не включает все возможности стандартного SQL. Пользователи могут выбирать между ними в зависимости от конкретных задач и потребностей.
Как выбрать между стандартным SQL и Legacy SQL в BigQuery?
Выбор между стандартным и Legacy SQL зависит от того, с какой версией запросов вам нужно работать. Стандартный SQL является более гибким и мощным, поддерживает функции, такие как подзапросы, общие таблицы выражений (CTE) и аналитику оконных функций. Это более современный и рекомендуемый диалект для новых проектов. Legacy SQL, в свою очередь, используется в основном для работы с устаревшими запросами и может не поддерживать все новые возможности, такие как определённые типы данных или синтаксис. В BigQuery можно настроить использование того или другого диалекта на уровне каждого запроса, что позволяет работать в обеих средах в зависимости от ситуации.