Transforma traducciones de SQL con archivos YAML de configuración
En este documento, se muestra cómo usar archivos YAML de configuración para transformar el código SQL mientras se lo migra a BigQuery. Se proporcionan lineamientos a fin de crear tus propios archivos YAML de configuración y se brindan ejemplos para varias transformaciones de traducción compatibles con esta función.
Cuando usas el traductor de SQL interactivo de BigQuery, la API de BigQuery Migration o realizas una traducción de SQL por lotes, puedes proporcionar archivos YAML de configuración para modificar una traducción de una consulta en SQL. El uso de archivos YAML de configuración permite una mayor personalización cuando se traducen consultas en SQL desde tu base de datos de origen.
Puedes especificar un archivo YAML de configuración para usar en una traducción de SQL de las siguientes maneras:
- Si usas el traductor interactivo de SQL, especifica la ruta de acceso del archivo al archivo de configuración o el ID de tarea de traducción por lotes en la configuración de traducción.
- Si usas la API de BigQuery Migration, coloca el archivo YAML de configuración en el mismo bucket de Cloud Storage que los archivos SQL de entrada.
- Si realizas una traducción de SQL por lotes, coloca el YAML de configuración en el mismo bucket de Cloud Storage que los archivos SQL de entrada.
- Si usas el cliente de Python de traducción por lotes, coloca el archivo YAML de configuración en la carpeta de entrada de traducción local.
El traductor interactivo de SQL, la API de BigQuery Migration, el traductor de SQL por lotes y el cliente de Python de traducción por lotes admiten el uso de varios archivos YAML de configuración en un solo trabajo de traducción. Para obtener más información, consulta Aplica varias opciones de configuración de YAML.
Requisitos del archivo YAML de configuración
Antes de crear un archivo YAML de configuración, revisa la siguiente información a fin de asegurarte de que tu archivo YAML sea compatible para usarlo con el Servicio de migración de BigQuery:
- Debes subir los archivos YAML de configuración al directorio raíz del bucket de Cloud Storage que contiene los archivos de entrada de traducción de SQL. Si deseas obtener información para crear buckets y subir archivos a Cloud Storage, consulta Crea buckets y Sube objetos desde un sistema de archivos.
- El tamaño de un solo archivo YAML de configuración no debe superar los 1 MB.
- El tamaño total del archivo de todos los archivos YAML de configuración que se usan en un solo trabajo de traducción de SQL no debe exceder los 4 MB.
- Si usas la sintaxis
regex
para la coincidencia de nombres, usa RE2/J. - Todos los nombres de los archivos YAML de configuración deben incluir una extensión
.config.yaml
, por ejemplo,change-case.config.yaml
.config.yaml
por sí solo no es un nombre válido para el archivo de configuración.
Lineamientos para crear un archivo YAML de configuración
En esta sección, se proporcionan algunos lineamientos generales para crear un archivo YAML de configuración:
Encabezado
Cada archivo de configuración debe contener un encabezado que especifique el tipo de configuración. El tipo object_rewriter
se usa para especificar traducciones de SQL en un archivo YAML de configuración. En el siguiente ejemplo, se usa el tipo object_rewriter
para transformar un caso práctico:
type: object_rewriter
global:
case:
all: UPPERCASE
Selección de entidad
Para llevar a cabo transformaciones específicas de la entidad, especifica la entidad en el archivo de configuración. Todas las propiedades match
son opcionales. Usa solo las propiedades match
necesarias para una transformación. En la siguiente YAML de configuración, se exponen las propiedades que deben coincidir para elegir entidades específicas:
match:
database: <literal_name>
schema: <literal_name>
relation: <literal_name>
attribute: <literal_name>
databaseRegex: <regex>
schemaRegex: <regex>
relationRegex: <regex>
attributeRegex: <regex>
Descripción de cada propiedad match
:
database
odb
: Es el componente project_id.schema
: el componente del conjunto de datos.relation
: el componente de la tabla.attribute
: el componente de la columna. Solo es válido para la selección de atributosdatabaseRegex
odbRegex
: Coincide con una propiedaddatabase
que tiene una expresión regular (Vista previa).schemaRegex
: Hace coincidir propiedadesschema
con expresiones regulares (Vista previa).relationRegex
: Coincide con las propiedadesrelation
que tienen expresiones regulares (Vista previa).attributeRegex
: Coincide con las propiedadesattribute
que tienen expresiones regulares. Solo es válido para la selección de atributos (Vista previa).
Por ejemplo, el siguiente YAML de configuración especifica las propiedades match
con el objetivo de seleccionar la tabla testdb.acme.employee
para una transformación de tabla temporal.
type: object_rewriter
relation:
-
match:
database: testdb
schema: acme
relation: employee
temporary: true
Puedes usar las propiedades databaseRegex
, schemaRegex
, relationRegex
y attributeRegex
para especificar expresiones regulares a fin de seleccionar un subconjunto de entidades. En el siguiente ejemplo, se cambian todas las relaciones del esquema tmp_schema
en testdb
a temporal, siempre que su nombre comience con tmp_
:
type: object_rewriter
relation:
-
match:
schema: tmp_schema
relationRegex: "tmp_.*"
temporary: true
Las propiedades literales y regex
coinciden de manera que no distingue mayúsculas de minúsculas.
Puedes aplicar la coincidencia que distingue mayúsculas de minúsculas mediante un regex
con una marca i
inhabilitada, como se ve en el siguiente ejemplo:
match:
relationRegex: "(?-i:<actual_regex>)"
También puedes especificar entidades completamente calificadas mediante una sintaxis de string corta equivalente. Una sintaxis de string corta espera exactamente 3 segmentos de nombre (para la selección de relaciones) o 4 segmentos de nombre (para la selección de atributos) delimitados por puntos, como el ejemplo testdb.acme.employee
. A continuación, los segmentos se interpretan de forma interna como si se hubieran pasado como database
, schema
, relation
y attribute
, respectivamente.
Esto significa que los nombres coinciden de manera literal, por lo que las expresiones regulares no están permitidas en la sintaxis corta. En el siguiente ejemplo, se muestra el uso de la sintaxis de string corta para especificar una entidad completamente calificada en un archivo YAML de configuración:
type: object_rewriter
relation:
-
match : "testdb.acme.employee"
temporary: true
Si una tabla contiene un punto en el nombre, no puedes especificar el nombre con una sintaxis corta. En este caso, debes usar una coincidencia de objeto. En el siguiente ejemplo, se cambia la tabla testdb.acme.stg.employee
a temporal:
type: object_rewriter
relation:
-
match:
database: testdb
schema: acme
relation: stg.employee
temporary: true
El YAML de configuración acepta key
como un alias para match
.
Base de datos predeterminada
Algunos dialectos de SQL de entrada, en particular Teradata, no admiten database-name
en el nombre calificado. En este caso, la forma más fácil de hacer coincidir las entidades es omitir la propiedad database
en match
.
Sin embargo, puedes configurar la propiedad default_database
del Servicio de migración de BigQuery y usar esa base de datos predeterminada en match
.
Tipos de atributos de destino admitidos
Puedes usar el archivo YAML de configuración para realizar transformaciones de tipo de atributo, en las que transformas el tipo de datos de una columna del tipo de origen a un tipo de destino. El archivo YAML de configuración admite los siguientes tipos de destino:
BOOLEAN
TINYINT
SMALLINT
INTEGER
BIGINT
FLOAT
DOUBLE
NUMERIC
(admite precisión y escala opcionales, comoNUMERIC(18, 2)
)TIME
TIMETZ
DATE
DATETIME
TIMESTAMP
TIMESTAMPTZ
CHAR
(admite precisión opcional, comoCHAR(42)
)VARCHAR
(admite precisión opcional, comoVARCHAR(42)
)
Ejemplos de YAML de configuración
En esta sección, se proporcionan ejemplos a fin de crear varios archivos YAML de configuración para usar con tus traducciones de SQL. En cada ejemplo, se describe la sintaxis YAML para transformar tu traducción de SQL de maneras específicas, junto con una descripción breve.
En cada ejemplo, también se proporciona el contenido de un archivo teradata-input.sql
o hive-input.sql
y del archivo bq-output.sql
para que puedas comparar los efectos de un YAML de configuración en la traducción de una consulta en SQL de BigQuery.
En los siguientes ejemplos, se usa Teradata o Hive como el dialecto de entrada de SQL y BigQuery SQL como el dialecto de salida. En los siguientes ejemplos, también se usa testdb
como la base de datos predeterminada, y testschema
como la ruta de búsqueda del esquema.
Cambia mayúsculas y minúsculas del nombre del objeto
En el siguiente YAML de configuración, se cambia las mayúsculas o minúsculas de los nombres de objetos:
type: object_rewriter
global:
case:
all: UPPERCASE
database: LOWERCASE
attribute: LOWERCASE
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
teradata-input.sql |
create table x(a int); select * from x; |
bq-output.sql |
CREATE TABLE testdb.TESTSCHEMA.X ( a INT64 ) ; SELECT X.a FROM testdb.TESTSCHEMA.X ; |
Haz que la tabla sea temporal
En el siguiente YAML de configuración, se cambia una tabla normal a una tabla temporal:
type: object_rewriter
relation:
-
match: "testdb.testschema.x"
temporary: true
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
teradata-input.sql |
create table x(a int); |
bq-output.sql |
CREATE TEMPORARY TABLE x ( a INT64 ) ; |
Haz que la tabla sea efímera
En el siguiente YAML de configuración, se cambia una tabla normal a una tabla efímera con un vencimiento de 60 segundos.
type: object_rewriter
relation:
-
match: "testdb.testschema.x"
ephemeral:
expireAfterSeconds: 60
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
teradata-input.sql |
create table x(a int); |
bq-output.sql |
CREATE TABLE testdb.testschema.x ( a INT64 ) OPTIONS( expiration_timestamp=timestamp_add(current_timestamp(), interval 60 SECOND) ); |
Establece el vencimiento de la partición
En el siguiente YAML de configuración, se cambia el vencimiento de una tabla particionada a 1 día:
type: object_rewriter
relation:
-
match: "testdb.testschema.x"
partitionLifetime:
expireAfterSeconds: 86400
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
teradata-input.sql |
create table x(a int, b int) partition by (a); |
bq-output.sql |
CREATE TABLE testdb.testschema.x ( a INT64, b INT64 ) CLUSTER BY a OPTIONS( partition_expiration_days=1 ); |
Cambia la ubicación o el formato externos de una tabla
En el siguiente YAML de configuración, se cambia la ubicación externa y formación de una tabla:
type: object_rewriter
relation:
-
match: "testdb.testschema.x"
external:
locations: "gs://path/to/department/files"
format: ORC
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
teradata-input.sql |
create table x(a int); |
bq-output.sql |
CREATE EXTERNAL TABLE testdb.testschema.x ( a INT64 ) OPTIONS( format='ORC', uris=[ 'gs://path/to/department/files' ] ); |
Configura o cambia la descripción de la tabla
En el siguiente YAML de configuración, se establece la descripción de una tabla:
type: object_rewriter
relation:
-
match: "testdb.testschema.x"
description:
text: "Example description."
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
teradata-input.sql |
create table x(a int); |
bq-output.sql |
CREATE TABLE testdb.testschema.x ( a INT64 ) OPTIONS( description='Example description.' ); |
Configura o cambia la partición de la tabla
En el siguiente YAML de configuración, se cambia el esquema de partición de una tabla:
type: object_rewriter
relation:
-
match: "testdb.testschema.x"
partition:
simple:
add: [a]
-
match: "testdb.testschema.y"
partition:
simple:
remove: [a]
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
teradata-input.sql |
create table x(a date, b int); create table y(a date, b int) partition by (a); |
bq-output.sql |
CREATE TABLE testdb.testschema.x ( a DATE, b INT64 ) PARTITION BY a; CREATE TABLE testdb.testschema.y ( a DATE, b INT64 ) ; |
Configura o cambia el agrupamiento en clústeres de la tabla
En el siguiente YAML de configuración de YAML, se cambia el esquema de agrupamiento en clústeres de una tabla:
type: object_rewriter
relation:
-
match: "testdb.testschema.x"
clustering:
add: [a]
-
match: "testdb.testschema.y"
clustering:
remove: [b]
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
hive-input.sql |
create table x(a int, b int); create table y(a int, b int) clustered by (b) into 16 buckets; |
bq-output.sql |
CREATE TABLE testdb.testschema.x ( a INT64, b INT64 ) CLUSTER BY a; CREATE TABLE testdb.testschema.y ( a INT64, b INT64 ) ; |
Cambia el tipo de un atributo de columna
En el siguiente YAML de configuración, se cambia el tipo de datos para un atributo de una columna:
type: object_rewriter
attribute:
-
match:
database: testdb
schema: testschema
attributeRegex: "a+"
type:
target: NUMERIC(10,2)
Puedes transformar el tipo de datos de origen a cualquiera de los tipos de atributos de destino admitidos.
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
teradata-input.sql |
create table x(a int, b int, aa int); |
bq-output.sql |
CREATE TABLE testdb.testschema.x ( a NUMERIC(31, 2), b INT64, aa NUMERIC(31, 2) ) ; |
Agrega una conexión al data lake externo
En la siguiente configuración de YAML, se marca la tabla de origen como una tabla externa que apunta a los datos almacenados en un data lake externo, especificado por una conexión de data lake.
type: object_rewriter
relation:
-
key: "testdb.acme.employee"
external:
connection_id: "connection_test"
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
hive-input.sql |
CREATE TABLE x ( a VARCHAR(150), b INT ); |
bq-output.sql |
CREATE EXTERNAL TABLE x ( a STRING, b INT64 ) WITH CONNECTION `connection_test` OPTIONS( ); |
Cambia la codificación de caracteres de un archivo de entrada
De forma predeterminada, el servicio de migración de BigQuery intenta detectar automáticamente la codificación de caracteres de los archivos de entrada. En los casos en los que el servicio de migración de BigQuery podría identificar de forma incorrecta la codificación de un archivo, puedes usar el YAML de configuración para especificar la codificación de caracteres de forma explícita.
El siguiente YAML de configuración especifica la codificación explícita de caracteres del archivo de entrada como ISO-8859-1
.
type: experimental_input_formats
formats:
- source:
pathGlob: "*.sql"
contents:
raw:
charset: iso-8859-1
Conversión de tipo global
El siguiente YAML de configuración cambia un tipo de datos a otro en todas las secuencias de comandos y especifica un tipo de datos de origen para evitar en la secuencia de comandos transpilada. Esto es diferente de la configuración Cambiar el tipo de atributo de la columna, en la que solo se cambia el tipo de datos para un solo atributo.
BigQuery admite las siguientes conversiones de tipo de datos:
- De
DATETIME
aTIMESTAMP
- De
TIMESTAMP
aDATETIME
(acepta la zona horaria opcional) - De
TIMESTAMP WITH TIME ZONE
aDATETIME
(acepta una zona horaria opcional) - De
CHAR
aVARCHAR
En el siguiente ejemplo, el YAML de configuración convierte TIMESTAMP
en DATETIME
.
type: experimental_object_rewriter
global:
typeConvert:
timestamp: DATETIME
En dialectos como Teradata, las funciones relacionadas con la fecha y hora, como current_date
, current_time
o current_timestamp
, muestran marcas de tiempo basadas en la zona horaria configurada, ya sea local o de sesión. Por otro lado, BigQuery siempre muestra marcas de tiempo en UTC. Para garantizar un comportamiento coherente entre los dos dialectos, es necesario configurar la zona horaria según corresponda.
En el siguiente ejemplo, el YAML de configuración convierte un tipo de datos TIMESTAMP
y un tipo de datos TIMESTAMP WITH TIME ZONE
en DATETIME
, con la zona horaria de destino establecida en Europe/Paris
.
type: experimental_object_rewriter
global:
typeConvert:
timestamp:
target: DATETIME
timezone: Europe/Paris
timestamptz:
target: DATETIME
timezone: Europe/Paris
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
teradata-input.sql |
create table x(a timestamp); select a from x where a > current_timestamp(0); |
bq-output.sql |
CREATE TABLE x ( a TIMESTAMP ) ; SELECT x.a FROM test.x WHERE x.a > datetime_trunc(current_datetime('Europe/Paris'), SECOND) ; |
Elige la modificación de una sentencia
En el siguiente YAML de configuración, se cambia la proyección en estrella, las cláusulas GROUP BY
y ORDER BY
en las sentenciasSELECT
.
starProjection
admite los siguientes parámetros de configuración:
ALLOW
PRESERVE
(predeterminada)EXPAND
groupBy
y orderBy
admiten los siguientes parámetros de configuración:
EXPRESSION
ALIAS
INDEX
En el siguiente ejemplo, el YAML de configuración configura la proyección en estrella en EXPAND
.
type: experimental_statement_rewriter
select:
starProjection: EXPAND
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
teradata-input.sql |
create table x(a int, b TIMESTAMP); select * from x; |
bq-output.sql |
CREATE TABLE x ( a INT64, b DATETIME ) ; SELECT x.a x.b FROM x ; |
Especificación de UDF
En el siguiente YAML de configuración, se especifica la firma de las funciones definidas por el usuario (UDF) que se usan en las secuencias de comandos de origen. Al igual que los archivos ZIP de metadatos, las definiciones de UDF pueden ayudar a producir una traducción más precisa de las secuencias de comandos de entrada.
type: metadata
udfs:
- "date parse_short_date(dt int)"
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
teradata-input.sql |
create table x(dt int); select parse_short_date(dt) + 1 from x; |
bq-output.sql |
CREATE TABLE x ( dt INT64 ) ; SELECT date_add(parse_short_date(x.dt), interval 1 DAY) FROM x ; |
Configura la rigurosidad de precisión decimal
De forma predeterminada, el servicio de migración de BigQuery aumenta la precisión numérica a la precisión más alta disponible para una escala determinada. El siguiente YAML de configuración anula este comportamiento con la configuración de la rigurosidad de precisión para retener la precisión decimal de la declaración de origen.
type: experimental_statement_rewriter
common:
decimalPrecision: STRICT
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
teradata-input.sql |
create table x(a decimal(3,0)); |
bq-output.sql |
CREATE TABLE x ( a NUMERIC(3) ) ; |
Asignación de nombre de salida
Puedes usar el YAML de configuración para asignar nombres de objetos SQL. Puedes cambiar diferentes partes del nombre según el objeto que se asigne.
Asignación de nombre estático
Usa la asignación de nombres estáticos para asignar el nombre de una entidad. Si solo deseas cambiar partes específicas del nombre y, al mismo tiempo, mantener otras partes del nombre iguales, incluye solo las partes que se deben cambiar.
El siguiente YAML de configuración cambia el nombre de la tabla de my_db.my_schema.my_table
a my_new_db.my_schema.my_new_table
.
type: experimental_object_rewriter
relation:
-
match: "my_db.my_schema.my_table"
outputName:
database: "my_new_db"
relation: "my_new_table"
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
teradata-input.sql |
create table my_db.my_schema.my_table(a int); |
bq-output.sql |
CREATE TABLE my_new_db.my_schema.my_new_table ( a INT64 ) |
Puedes usar la asignación de nombres estáticos para actualizar la región que usan los nombres en las funciones públicas definidas por el usuario.
En el siguiente ejemplo, se cambian los nombres de la UDF bqutil.fn
de usar la multiregión predeterminada us
a usar la región europe_west2
:
type: experimental_object_rewriter
function:
-
match:
database: bqutil
schema: fn
outputName:
database: bqutil
schema: fn_europe_west2
Asignación dinámica de nombres
Usa la asignación dinámica de nombres para cambiar varios objetos al mismo tiempo y crear nombres nuevos basados en los objetos asignados.
En el siguiente YAML de configuración, se cambia el nombre de todas las tablas cuando se agrega el prefijo stg_
a los que pertenecen al esquema staging
y, luego, se mueven a esas tablas al esquema production
.
type: experimental_object_rewriter
relation:
-
match:
schema: staging
outputName:
schema: production
relation: "stg_${relation}"
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
teradata-input.sql |
create table staging.my_table(a int); |
bq-output.sql |
CREATE TABLE production.stg_my_table ( a INT64 ) ; |
Especifica la base de datos predeterminada y la ruta de búsqueda del esquema
El siguiente YAML de configuración especifica una base de datos predeterminada y una ruta de búsqueda de esquema.
type: environment
session:
defaultDatabase: myproject
schemaSearchPath: [myschema1, myschema2]
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
teradata-input.sql |
SELECT * FROM database.table SELECT * FROM table1 |
bq-output.sql |
SELECT * FROM myproject.database.table. SELECT * FROM myproject.myschema1.table1 |
Reescritura del nombre del resultado global
El siguiente YAML de configuración cambia los nombres de salida de todos los objetos (base de datos, esquema, relación y atributos) en la secuencia de comandos según las reglas configuradas.
type: experimental_object_rewriter
global:
outputName:
regex:
- match: '\s'
replaceWith: '_'
- match: '>='
replaceWith: 'gte'
- match: '^[^a-zA-Z_].*'
replaceWith: '_$0'
Una traducción de SQL con este archivo YAML de configuración podría tener el siguiente aspecto:
teradata-input.sql |
create table "test special chars >= 12"("42eid" int, "custom column" varchar(10)); |
bq-output.sql |
CREATE TABLE test_special_chars_employees_gte_12 ( _42eid INT64, custom_column STRING ) ; |
Optimiza y mejora el rendimiento de SQL traducido
Las transformaciones opcionales se pueden aplicar a SQL traducido para ingresar cambios que puedan mejorar la consulta en términos de rendimiento o costo. Estas optimizaciones dependen estrictamente del caso y deben evaluarse en función del resultado de SQL no modificado para evaluar su efecto real en el rendimiento.
El siguiente YAML de configuración habilita transformaciones opcionales. La configuración acepta una lista de optimizaciones y, para las optimizaciones que aceptan parámetros, una sección con valores de parámetros opcionales.
type: experimental_optimizer
transformations:
- name: PRECOMPUTE_INDEPENDENT_SUBSELECTS
- name: REWRITE_CTE_TO_TEMP_TABLE
parameters:
threshold: 1
Optimización | Parámetro opcional | Descripción |
---|---|---|
PRECOMPUTE_INDEPENDENT_SUBSELECTS |
scope: [PREDICATE, PROJECTION]
|
Vuelve a escribir la consulta agregando una sentencia DECLARE para reemplazar una expresión en cláusulas PREDICATE o PROJECTION con una variable calculada previamente. Esto se identificará como un predicado estático que permitirá una reducción de la cantidad de datos leídos. Si se omite el permiso, el valor predeterminado es PREDICATE (es decir, las cláusulas WHERE y JOIN-ON ).
Si extraes una subconsulta escalar a una sentencia DECLARE , el predicado original se volverá estático y, por lo tanto, se podrá planificar mejor la ejecución. Esta optimización introducirá nuevas instrucciones de SQL.
|
REWRITE_CTE_TO_TEMP_TABLE |
threshold: N
|
Vuelve a escribir expresiones de tabla comunes (CTE) en tablas temporales cuando hay más de N referencias a la misma expresión de tabla común. Esto reduce la complejidad de las consultas y fuerza la ejecución única de la expresión de tabla común.
Si se omite N , el valor predeterminado es 4.
Recomendamos usar esta optimización cuando se haga referencia a las CTE no triviales varias veces. La introducción de tablas temporales tiene una sobrecarga que podría ser mayor que las ejecuciones múltiples eventuales de una CTE de baja complejidad o baja cardinalidad. Esta optimización introducirá nuevas instrucciones de SQL. |
REWRITE_ZERO_SCALE_NUMERIC_AS_INTEGER |
bigint: N
|
Reescribe los atributos NUMERIC/BIGNUMERIC de escala cero al tipo INT64 si la precisión está dentro de N . Si se omite N , el valor predeterminado es 18 .
Recomendamos usar esta optimización cuando se traduce de dialectos de origen que no tienen tipos de número entero. Para cambiar los tipos de columna, se deben revisar todos los usos downstream para la compatibilidad de tipos y los cambios semánticos. Por ejemplo, las divisiones fraccionarias se convierten en divisiones de números enteros, y el código espera valores numéricos. |
DROP_TEMP_TABLE |
Agrega instrucciones DROP TABLE para todas las tablas temporales creadas en una secuencia de comandos y que no se descartaron al final. Esto reduce el período de facturación de almacenamiento de la tabla temporal de 24 horas al tiempo de ejecución de la secuencia de comandos. Esta optimización introducirá nuevas instrucciones de SQL.
Recomendamos usar esta optimización cuando no se acceda a las tablas temporales para ningún otro procesamiento después del final de la ejecución de la secuencia de comandos. Esta optimización introducirá nuevas instrucciones de SQL. |
|
REGEXP_CONTAINS_TO_LIKE |
Vuelve a escribir algunas categorías de patrones que coinciden de REGEXP_CONTAINS en expresiones LIKE .
Recomendamos usar esta optimización cuando ningún otro proceso, como el reemplazo de macros, dependa de que los literales de patrón de expresión regular se conserven sin cambios en el SQL de salida. |
|
ADD_DISTINCT_TO_SUBQUERY_IN_SET_COMPARISON |
Agrega la cláusula DISTINCT a las subconsultas que se usan como conjunto de valores para el operador [NOT] IN .
Recomendamos usar esta optimización cuando la cardinalidad (cantidad distinta de valores) del resultado de la subconsulta sea significativamente menor que la cantidad de valores. Cuando no se cumple esta condición previa, esta transformación puede tener efectos negativos en el rendimiento. |
Crea un archivo YAML de configuración basado en Gemini
Para generar resultados de IA, el directorio del código fuente que contiene la entrada de traducción de SQL debe incluir un archivo YAML de configuración.
Requisitos
El archivo YAML de configuración para los resultados de IA debe tener el sufijo .ai_config.yaml
.
Por ejemplo, rules_1.ai_config.yaml
Campos disponibles
suggestion_type: SUGGESTION_TYPE
rewrite_target: TARGET
instruction: NL_PROMPT
translation_rules:
- instruction: NL_RULE_1
examples:
- input: RULE_1_INPUT_1
output: RULE_1_OUTPUT_1
- input: RULE_1_INPUT_2
output: RULE_1_OUTPUT_2
- instruction: NL_RULE_2
examples:
- input: RULE_2_INPUT_1
output: RULE_2_OUTPUT_1
…
…
Puedes reemplazar las siguientes variables para configurar el resultado de la traducción de IA:
SUGGESTION_TYPE
(opcional): Especifica el tipo de sugerencia de IA que se generará. Se admiten los siguientes tipos de sugerencias:QUERY_CUSTOMIZATION
(predeterminada): Genera sugerencias de IA para el código SQL según las reglas de traducción especificadas en el archivo YAML de configuración.TRANSLATION_EXPLANATION
: Genera texto que incluye un resumen de la consulta de GoogleSQL traducida y las diferencias e inconsistencias entre la consulta en SQL de origen y la consulta de GoogleSQL traducida.CUSTOM_SUGGESTION
: Genera resultados de SQL o texto con artefactos de traducción. Los usuarios pueden consultar artefactos de traducción en instrucciones que incluyen marcadores de posición. El servicio de traducción adjunta los artefactos correspondientes a la instrucción LLM final que se envía a Gemini. Los siguientes artefactos de traducción se pueden incluir en la instrucción:{{SOURCE_DIALECT}}
: Se usa para hacer referencia al dialecto de SQL de origen.{{SOURCE_SQL}}
: Se usa para hacer referencia al SQL de la fuente de traducción.{{TARGET_SQL}}
: Se usa para hacer referencia al SQL traducido predeterminado.
TARGET
(opcional): Especifica si deseas aplicar la regla de traducción a tu SQL de entrada,SOURCE_SQL
, o al SQL de salida,TARGET_SQL
(predeterminado).NL_PROMPT
(opcional): En lenguaje natural, describe un cambio en el SQL de destino. La traducción de SQL mejorada con Gemini evalúa la solicitud y realiza el cambio especificado.NL_RULE_1
(opcional): En lenguaje natural, describe una regla de traducción.RULE_1_INPUT_1
(opcional): Es un patrón de SQL que deseas reemplazar.RULE_1_OUTPUT_1
(opcional): Es el patrón de SQL esperado después de reemplazarinput
.
Puedes agregar translation_rules
y examples
adicionales según sea necesario.
Ejemplos
En los siguientes ejemplos, se crean archivos YAML de configuración basados en Gemini que puedes usar con tus traducciones de SQL.
Se quitó la función superior en la consulta de resultados de traducción predeterminada.
translation_rules:
- instruction: "Remove upper() function"
examples:
- input: "upper(X)"
output: "X"
Crea varias reglas de traducción para personalizar el resultado de la traducción
translation_rules:
- instruction: "Remove upper() function"
examples:
- input: "upper(X)"
output: "X"
- instruction: "Insert a comment at the head that explains each statement in detail.
Quita los comentarios de SQL de la consulta de entrada de traducción
rewrite_target: SOURCE_SQL
translation_rules:
- instruction: "Remove all the sql comments in the input sql query."
Genera explicaciones de traducción con la instrucción LLM predeterminada
En este ejemplo, se usan las instrucciones predeterminadas de LLM que proporciona el servicio de traducción para generar explicaciones de texto:
suggestion_type: "TRANSLATION_EXPLANATION"
Genera explicaciones de traducción con tus propias instrucciones en lenguaje natural
suggestion_type: "TRANSLATION_EXPLANATION"
instruction: "Explain the syntax differences between the source Teradata query and the translated GoogleSQL query."
Se corrigió el error de traducción de MySQL a GoogleSQL: unsupported constraint on PRIMARY
suggestion_type: "CUSTOM_SUGGESTION"
instruction: "Add PRIMARY KEY (...) NOT ENFORCED to the target sql as a column constraint based on the source sql. Output sql without sql code block.\n\nsource sql: {{SOURCE_SQL}}\ntarget sql: {{TARGET_SQL}}"
Aplica varias opciones de configuración de YAML
Cuando especificas un archivo YAML de configuración en una traducción de SQL por lotes o interactiva, puedes seleccionar varios archivos YAML de configuración en un solo trabajo de traducción para reflejar varias transformaciones. Si varias opciones de configuración entran en conflicto, una transformación puede anular a otra. Recomendamos usar diferentes tipos de ajustes de configuración en cada archivo para evitar transformaciones conflictivas en el mismo trabajo de traducción.
En el siguiente ejemplo, se enumeran dos archivos YAML de configuración independientes que se proporcionaron para un solo trabajo de traducción de SQL, uno a fin de cambiar el atributo de una columna y el otro para configurar la tabla como temporal:
change-type-example.config.yaml
:
type: object_rewriter
attribute:
-
match: "testdb.testschema.x.a"
type:
target: NUMERIC(10,2)
make-temp-example.config.yaml
:
type: object_rewriter
relation:
-
match: "testdb.testschema.x"
temporary: true
Una traducción de SQL con estos dos archivos YAML de configuración podría tener el siguiente aspecto:
teradata-input.sql |
create table x(a int); |
bq-output.sql |
CREATE TEMPORARY TABLE x ( a NUMERIC(31, 2) ) ; |