Вопрос или проблема
Я изучаю облачные рабочие процессы и после просмотра документации и предоставленного примера, я попытался выполнить SQL-запрос с использованием рабочего процесса.
YAML файл корректен, и он также генерирует DAG. Но когда я пытаюсь его развернуть, возникает следующая ошибка.
Не удалось развернуть рабочий процесс: main.yaml:12:36: ошибка разбора: в рабочем процессе 'main', шаг 'runQuery1': несоответствующий ввод 'Y', ожидается EXPRESSION_END
query: '${ "INSERT INTO `output_dataset.employee_changes`
^
Ниже приведен мой код YAML:
main:
steps:
- runQuery1:
call: googleapis.bigquery.v2.jobs.query
args:
projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
body:
useLegacySql: false
useQueryCache: false
timeoutMs: 30000
query: '${ "INSERT INTO `output_dataset.employee_changes`
select *,current_date as start_date,Null as end_data,CAST("Y" AS STRING) as
is_active from `raw_dataset.v_employee_raw` a where a.id not in
(select id from `output_dataset.employee_changes`)" }'
Я пытался поставить “‘” (одинарные кавычки) вокруг символа $, хотя в примере это не упоминается, но в ошибке меня просили добавить кавычки вокруг символа $.
Я также пытался проверить YAML, и YAML корректен.
Ответ или решение
Ошибка парсинга в Cloud Workflows, с которой вы столкнулись, может быть связана с синтаксическими особенностями YAML и правилами обработки строк. В данном случае, проблема заключается в том, как вы используете выражение внутри строки запроса SQL. Давайте внимательно рассмотрим ваш код и предложим исправление.
Ваш текущий YAML-код выглядит следующим образом:
main:
steps:
- runQuery1:
call: googleapis.bigquery.v2.jobs.query
args:
projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
body:
useLegacySql: false
useQueryCache: false
timeoutMs: 30000
query: '${ "INSERT INTO `output_dataset.employee_changes`
select *,current_date as start_date,Null as end_data,CAST("Y" AS STRING) as
is_active from `raw_dataset.v_employee_raw` a where a.id not in
(select id from `output_dataset.employee_changes`)" }'
Обратите внимание на использование кавычек и фигурных скобок внутри строки запроса. Чтобы избежать ошибок парсинга, рекомендуется следующее:
-
Убедитесь, что одинарные кавычки, используемые для обозначения строк в YAML, не конфликтуют с символами внутри SQL-запроса. В данном случае следует избегать использования одинарных кавычек в самом SQL-запросе, поскольку это может вызывать путаницу.
- Не используйте фигурные скобки внутри строки запроса, если они не нужны. Это также может привести к проблемам с разбором.
Ваша исправленная версия может выглядеть следующим образом:
main:
steps:
- runQuery1:
call: googleapis.bigquery.v2.jobs.query
args:
projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
body:
useLegacySql: false
useQueryCache: false
timeoutMs: 30000
query: "INSERT INTO `output_dataset.employee_changes`
SELECT *, CURRENT_DATE AS start_date, NULL AS end_data, CAST('Y' AS STRING) AS
is_active FROM `raw_dataset.v_employee_raw` a
WHERE a.id NOT IN
(SELECT id FROM `output_dataset.employee_changes`)"
Обратите внимание, что в этой версии:
- Убраны фигурные скобки и одинарные кавычки вокруг SQL-запроса.
- Одинарные кавычки используются только для строкового значения ‘Y’, что соответствует стандартам SQL.
После этих изменений попробуйте снова развернуть ваш Workflow. Если ошибка продолжает возникать, внимательно проверьте все строки на наличие дополнительных синтаксических ошибок и конфликтов.
Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться!