Cambia esquemas de tablas de forma manual

En este documento, se describe cómo cambiar de manera manual la definición de esquema para tablas de BigQuery existentes. Muchos cambios de esquema no son compatibles de manera nativa en BigQuery y requieren soluciones alternativas manuales. Las modificaciones de esquema no compatibles incluyen las siguientes opciones:

  • Cambiar el nombre de una columna
  • Cambiar el tipo de datos de una columna
  • Cambiar el modo de una columna (además de disminuir la rigurosidad de las columnas REQUIRED a NULLABLE)
  • Borrar una columna

Para obtener más información sobre cambios de esquema compatibles en BigQuery, consulta Modifica esquemas de tablas.

Cambia el nombre de una columna

GCP Console, la IU web clásica de BigQuery, la herramienta de línea de comandos y la API no admiten el cambio de nombre de una columna. Si intentas actualizar un esquema de tabla mediante una columna renombrada, se muestra el siguiente error: BigQuery error in update operation: Provided Schema does not match Table project_id:dataset.table.

Hay dos maneras de renombrar una columna de forma manual:

  • Usa una consulta de SQL: elige esta opción si te preocupa más la simplicidad y la facilidad de uso que los costos.
  • Recrea la tabla: elige esta opción si te preocupan más los costos que la simplicidad y la facilidad de uso.

Opción 1: usa una consulta

Para cambiar el nombre de una columna con una consulta de SQL, selecciona todas las columnas en la tabla y proporciona un alias a la columna que necesitas renombrar. Puedes usar el resultado de consulta para reemplazar la tabla existente o crear una tabla de destino nueva. Cuando le proporcionas un alias a la columna con un nombre nuevo, debe cumplir con las reglas de BigQuery para los nombres de columna.

Ventajas

  • El uso de una consulta para escribir los datos en una tabla de destino nueva conserva tus datos originales.
  • Si usas el trabajo de consulta a fin de reemplazar la tabla original, generas costos de almacenamiento para una tabla en vez de dos, pero pierdes los datos originales.

Desventajas

  • Cambiar el nombre de una columna con una consulta requiere que escanees la tabla completa: los cargos de la consulta pueden ser importantes si la tabla es muy grande.
  • Si escribes los resultados de la consulta en una tabla de destino nueva, generas costos de almacenamiento para la tabla anterior y la nueva (excepto si borras la anterior).

Opción 2: exporta tus datos y cárgalos a una tabla nueva

También puedes renombrar una columna si exportas los datos de tu tabla a Cloud Storage y, luego, cargas los datos en una tabla nueva con una definición de esquema que contenga el nombre de columna correcto. También puedes usar el trabajo de carga para reemplazar la tabla existente.

Ventajas

  • No generas cargos por el trabajo de exportación o de carga. Por el momento, los trabajos de carga y exportación de BigQuery son gratuitos.
  • Si usas el trabajo de carga a fin de reemplazar la tabla original, generas costos de almacenamiento para una tabla en vez de dos, pero pierdes los datos originales.

Desventajas

  • Si cargas los datos en una tabla nueva, generas costos de almacenamiento para la tabla original y la tabla nueva (excepto si borras la anterior).
  • Generas costos por almacenar los datos exportados en Cloud Storage.

Ejemplo de alias de columna

En el ejemplo siguiente, se muestra una consulta de SQL estándar que selecciona todos los datos en mytable excepto por 2 columnas que requieren que se las renombre. Se usa un alias a fin de generar nombres nuevos para 2 columnas. column_one se renombra newcolumn_one, y column_two se renombra newcolumn_two. El resultado de la consulta se usa para reemplazar la tabla existente.

Consola

  1. En la IU web de la consola de BigQuery, selecciona el Editor de consultas.

  2. En el Editor de consultas, ingresa la siguiente consulta para seleccionar todos los datos en mydataset.mytable excepto las dos columnas que se deben renombrar. mydataset.mytable está en tu proyecto predeterminado. La consulta usa un alias para cambiar el nombre de column_one a newcolumn_one y de column_two a newcolumn_two.

    SELECT
     * EXCEPT(column_one, column_two),
     column_one AS newcolumn_one, column_two AS newcolumn_two
    FROM
     mydataset.mytable
    
  3. Haz clic en Más (More) y selecciona Configuración de consulta (Query settings).

    Configuración de consulta

  4. En la sección Destino (Destination), marca Establecer una tabla de destino para los resultados de la consulta (Set a destination table for query results).

    Configurar tabla de destino

  5. Haz lo que se indica para los siguientes campos:

    1. En Nombre del proyecto, deja el valor establecido en tu proyecto predeterminado. Este es el proyecto que contiene mydataset.mytable.

    2. En Nombre del conjunto de datos, elige mydataset.

    3. En el campo Nombre de tabla, ingresa mytable.

    4. Haz clic en Aceptar.

  6. En la sección Preferencia de escritura de la tabla de destino (Destination table write preference), para Preferencia de escritura, elige Reemplazar tabla (Overwrite table). Esto reemplazará mytable por los resultados de la consulta.

    Reemplazar tabla

  7. En Ubicación de procesamiento (Processing location), elige la ubicación de tus datos (opcional).

  8. Haz clic en Guardar para actualizar la configuración y, luego, en el Editor de consultas, haz clic en Ejecutar. Cuando se completa el trabajo de la consulta, las columnas en mytable tienen nombres nuevos.

IU clásica

  1. En la IU web clásica de BigQuery, haz clic en Redactar consulta.

  2. En el cuadro Consulta nueva, ingresa la consulta siguiente para seleccionar todos los datos en mydataset.mytable excepto las dos columnas que se deben renombrar. mydataset.mytable está en tu proyecto predeterminado. La consulta usa un alias para cambiar el nombre de column_one a newcolumn_one y de column_two a newcolumn_two.

    #standardSQL
    SELECT
     * EXCEPT(column_one, column_two),
     column_one AS newcolumn_one, column_two AS newcolumn_two
    FROM
     mydataset.mytable
    
  3. Haz clic en Mostrar opciones.

  4. En la sección Tabla de destino, haz clic en Seleccionar tabla.

  5. En el cuadro de diálogo Seleccionar tabla de destino, haz lo siguiente:

    1. Para Proyecto, deja el valor establecido en tu proyecto predeterminado. Este es el proyecto que contiene mydataset.mytable.

    2. En Conjunto de datos, elige mydataset.

    3. En el campo ID de tabla, ingresa mytable.

    4. Haz clic en Aceptar.

  6. En la sección Tabla de destino, para Preferencia de escritura, elige Reemplazar tabla. Esto reemplazará mytable porlos resultados de la consulta.

  7. En Ubicación de procesamiento, haz clic en Sin especificar y elige la ubicación de tus datos (opcional).

  8. Haz clic en Ejecutar consulta. Cuando se completa el trabajo de la consulta, las columnas en mytable tienen nombres nuevos.

CLI

Ingresa el comando siguiente bq query para seleccionar todos los datos en mydataset.mytable, excepto las dos columnas que necesitan que se las renombre. mydataset.mytable está en el proyecto predeterminado. La consulta usa un alias para cambiar el nombre de column_one a newcolumn_one y de column_two a newcolumn_two.

Escribe los resultados de la consulta en mydataset.mytable mediante la marca --destination_table, y especifica --replace para reemplazar mytable. Especifica la marca use_legacy_sql=false para usar la sintaxis de SQL estándar.

Proporciona la marca --location y configura el valor como tu ubicación (opcional).

bq query \
--destination_table mydataset.mytable \
--replace \
--use_legacy_sql=false \
'SELECT
  * EXCEPT(column_one,
    column_two),
  column_one AS newcolumn_one,
  column_two AS newcolumn_two
FROM
  mydataset.mytable'

API

Para cambiar el nombre de column_one a newcolumn_one y el de column_two a newcolumn_two, llama al método jobs.insert y configura un trabajo de query. Especifica tu ubicación en la propiedad location de la sección jobReference (opcional).

La consulta de SQL usada en el trabajo de consulta sería la siguiente: SELECT * EXCEPT(column_one, column_two), column_one AS newcolumn_one, column_two AS newcolumn_two FROM mydataset.mytable Esta consulta selecciona todos los datos en mytable excepto por las 2 columnas que requieren que se las renombre. Se usa un alias a fin de generar nombres nuevos para 2 columnas.

Para reemplazar mytable por los resultados de la consulta, debes incluir mydataset.mytable en la propiedad configuration.query.destinationTable y especificar WRITE_TRUNCATE en la propiedad configuration.query.writeDisposition. Para especificar una tabla de destino nueva, ingresa el nombre de la tabla en la propiedad configuration.query.destinationTable.

Cambia el tipo de datos de una columna

GCP Console, la IU web clásica de BigQuery, la herramienta de línea de comandos y la API no admiten el cambio de tipo de datos de una columna. Si intentas actualizar una tabla mediante la aplicación de un esquema que especifique un tipo de datos nuevo para una columna, se muestra el siguiente error: BigQuery error in update operation: Provided Schema does not match Table project_id:dataset.table.

Hay dos maneras de cambiar de forma manual el tipo de datos de una columna:

  • Usa una consulta de SQL: elige esta opción si te preocupa más la simplicidad y la facilidad de uso que los costos.
  • Recrea la tabla: elige esta opción si te preocupan más los costos que la simplicidad y la facilidad de uso.

Opción 1: usa una consulta

Usa una consulta de SQL para seleccionar todos los datos de la tabla y transmitir la columna relevante como un tipo de datos diferente. Puedes usar los resultados de la consulta para reemplazar la tabla o crear una tabla de destino nueva.

Ventajas

  • El uso de una consulta para escribir los datos en una tabla de destino nueva conserva tus datos originales.
  • Si usas el trabajo de consulta a fin de reemplazar la tabla original, generas costos de almacenamiento para una tabla en vez de dos, pero pierdes los datos originales.

Desventajas

  • Cambiar el tipo de datos de una columna con una consulta requiere que escanees la tabla completa: los cargos de la consulta pueden ser importantes si la tabla es muy grande.
  • Si escribes los resultados de la consulta en una tabla de destino nueva, generas costos de almacenamiento para la tabla anterior y la nueva (excepto si borras la anterior).

Opción 2: exporta tus datos y cárgalos a una tabla nueva

También puedes cambiar el tipo de datos de una columna si exportas los datos de la tabla a Cloud Storage y, luego, los cargas en una tabla nueva con una definición de esquema que especifique el nuevo tipo de datos correcto para la columna. También puedes usar el trabajo de carga para reemplazar la tabla existente.

Ventajas

  • No generas cargos por el trabajo de exportación o de carga. Por el momento, los trabajos de carga y exportación de BigQuery son gratuitos.
  • Si usas el trabajo de carga a fin de reemplazar la tabla original, generas costos de almacenamiento para una tabla en vez de dos, pero pierdes los datos originales.

Desventajas

  • Si cargas los datos en una tabla nueva, generas costos de almacenamiento para la tabla original y la tabla nueva (excepto si borras la anterior).
  • Generas costos por almacenar los datos exportados en Cloud Storage.

Ejemplo CAST

En el ejemplo siguiente, se muestra una consulta de SQL estándar que selecciona todos los datos de column_two y column_three en mydataset.mytable y transmite column_one desde DATE a STRING. El resultado de la consulta se usa para reemplazar la tabla existente. La tabla reemplazada almacenará column_one como un tipo de datos STRING.

Cuando usas CAST, la consulta puede fallar si BigQuery no puede realizar la transmisión. Para obtener más detalles sobre las reglas de transmisión en SQL estándar, consulta la sección sobre Transmisión en la documentación de referencia de operadores y funciones.

Console

  1. En GCP Console, haz clic en Redactar consulta nueva.

  2. En el Editor de consultas, ingresa la consulta siguiente para seleccionar todos los datos de column_two y column_three en mydataset.mytable y transmitir column_one de DATE a STRING. La consulta usa un alias para transmitir column_one con el mismo nombre. mydataset.mytable está en tu proyecto predeterminado.

    SELECT
     column_two, column_three, CAST(column_one AS STRING) AS column_one
    FROM
     mydataset.mytable
    
  3. Haz clic en Más y selecciona Configuración de consulta.

  4. En la sección Destino, marca Establecer una tabla de destino para los resultados de la consulta.

  5. Haz lo que se indica para los siguientes campos:

    1. En Nombre del proyecto, deja el valor establecido en tu proyecto predeterminado. Este es el proyecto que contiene mydataset.mytable.

    2. En Nombre del conjunto de datos, elige mydataset.

    3. En el campo Nombre de tabla, ingresa mytable.

    4. Haz clic en Aceptar.

  6. En la sección Preferencia de escritura de la tabla de destino, para Preferencia de escritura, elige Reemplazar tabla. Esto reemplazará mytable por los resultados de la consulta.

  7. En Ubicación de procesamiento, haz clic en Selección automática y elige la ubicación de tus datos (opcional).

  8. Haz clic en Guardar para actualizar la configuración y, luego, en el Editor de consultas, haz clic en Ejecutar. Cuando se completa el trabajo de la consulta, el tipo de datos de column_one es STRING.

IU clásica

  1. En la IU web clásica de BigQuery, haz clic en Redactar consulta.

  2. En el cuadro Consulta nueva, ingresa la siguiente consulta para seleccionar todos los datos de column_two y column_three en mydataset.mytable y transmitir column_one de DATE a STRING. La consulta usa un alias para transmitir column_one con el mismo nombre. mydataset.mytable está en tu proyecto predeterminado.

    #standardSQL
    SELECT
     column_two, column_three, CAST(column_one AS STRING) AS column_one
    FROM
     mydataset.mytable
    
  3. Haz clic en Mostrar opciones.

  4. En la sección Tabla de destino, haz clic en Seleccionar tabla.

  5. En el cuadro de diálogo Seleccionar tabla de destino, haz lo siguiente:

    1. Para Proyecto, deja el valor establecido en tu proyecto predeterminado. Este es el proyecto que contiene mydataset.mytable.

    2. En Conjunto de datos, elige mydataset.

    3. En el campo ID de tabla, ingresa mytable.

    4. Haz clic en Aceptar.

  6. En la sección Tabla de destino, para Preferencia de escritura, elige Reemplazar tabla. Esto reemplazará mytable porlos resultados de la consulta.

  7. En Ubicación de procesamiento, haz clic en Sin especificar y elige la ubicación de tus datos (opcional).

  8. Haz clic en Ejecutar consulta. Cuando se completa el trabajo de la consulta, el tipo de datos de column_one es STRING.

CLI

Ingresa el comando siguiente bq query a fin de seleccionar todos los datos de column_two y column_three en mydataset.mytable y para transmitir column_one desde DATE a STRING. La consulta usa un alias a fin de transmitir column_one con el mismo nombre. mydataset.mytable está en tu proyecto predeterminado.

Los resultados de la consulta están escritos en mydataset.mytable con la marca --destination_table y la marca --replace se usa para reemplazar mytable. Especifica la marca use_legacy_sql=false para usar la sintaxis de SQL estándar.

Proporciona la marca --location y configura el valor como tu ubicación (opcional).

bq query \
--destination_table mydataset.mytable \
--replace \
--use_legacy_sql=false \
'SELECT
  column_two,
  column_three,
  CAST(column_one AS STRING) AS column_one
FROM
  mydataset.mytable'

API

Para seleccionar todos los datos de column_two y column_three en mydataset.mytable y transmitir column_one de DATE a STRING, debes llamar al método jobs.insert y configurar un trabajo de query. Especifica tu ubicación en la propiedad location de la sección jobReference (opcional).

La consulta de SQL usada en el trabajo de consulta sería la siguiente: SELECT column_two, column_three, CAST(column_one AS STRING) AS column_one FROM mydataset.mytable. La consulta usa un alias para transmitir column_one con el mismo nombre.

Para reemplazar mytable por los resultados de la consulta, debes incluir mydataset.mytable en la propiedad configuration.query.destinationTable y especificar WRITE_TRUNCATE en la propiedad configuration.query.writeDisposition.

Cambia el modo de una columna

Por el momento, la única modificación que puedes hacer al modo de una columna es cambiar de REQUIRED a NULLABLE. Cambiar el modo de una columna de REQUIRED a NULLABLE también se llama columna de relajación. Para obtener más información sobre la disminución de la rigurosidad de las columnas REQUIRED a NULLABLE, consulta la sección sobre Cómo disminuir la rigurosidad del modo de una columna.

Si tratas de aplicar un cambio no admitido en un modo de columna, se muestra un error como el siguiente. En este ejemplo, se intentó cambiar un modo de columna de NULLABLE a REPEATED: BigQuery error in update operation: Provided Schema does not match Table project_id:dataset.table. Field field has changed mode from NULLABLE to REPEATED.

Exporta tus datos y cárgalos a una tabla nueva

Puedes cambiar el modo de una columna de manera manual si exportas los datos de tu tabla a Cloud Storage y, luego, cargas los datos en una tabla nueva con una definición de esquema que especifique el modo correcto para la columna. También puedes usar el trabajo de carga para reemplazar la tabla existente.

Ventajas

  • No generas cargos por el trabajo de exportación o de carga. Por el momento, los trabajos de carga y exportación de BigQuery son gratuitos.
  • Si usas el trabajo de carga a fin de reemplazar la tabla original, generas costos de almacenamiento para una tabla en vez de dos, pero pierdes los datos originales.

Desventajas

  • Si cargas los datos en una tabla nueva, generas costos de almacenamiento para la tabla original y la tabla nueva (excepto si borras la anterior).
  • Generas costos por almacenar los datos exportados en Cloud Storage.

Borra una columna de un esquema de tabla

GCP Console, la IU web clásica de BigQuery, la herramienta de línea de comandos y la API no admiten la eliminación de una columna del esquema de una tabla existente. Si intentas actualizar una tabla mediante la aplicación de un esquema que quita una columna, se muestra el siguiente error: BigQuery error in update operation: Provided Schema does not match Table project_id:dataset.table.

Hay dos maneras de borrar una columna de forma manual:

  • Usa una consulta de SQL: elige esta opción si te preocupa más la simplicidad y la facilidad de uso que los costos.
  • Recrea la tabla: elige esta opción si te preocupan más los costos que la simplicidad y la facilidad de uso.

Opción 1: usa una consulta

Usa una consulta SELECT * EXCEPT que excluya la columna (o columnas) que quieres quitar y usa el resultado de la consulta para reemplazar la tabla o crear una tabla de destino nueva.

Ventajas

  • El uso de una consulta para escribir los datos en una tabla de destino nueva conserva tus datos originales.
  • Si usas el trabajo de consulta a fin de reemplazar la tabla original, generas costos de almacenamiento para una tabla en vez de dos, pero pierdes los datos originales.

Desventajas

  • Borrar una columna con una consulta requiere que escanees los datos en todas las columnas excepto en la que quitas. Los cargos de la consulta pueden ser importantes si la tabla es muy grande.
  • Si escribes los resultados de la consulta en una tabla de destino nueva, generas costos de almacenamiento para la tabla anterior y la nueva (excepto si borras la anterior).

Opción 2: exporta tus datos y cárgalos a una tabla nueva

También puedes quitar una columna si exportas los datos de tu tabla a Cloud Storage, borras los datos correspondientes a la columna (o columnas) que deseas quitar y, luego, cargas los datos en una tabla nueva con una definición de esquema que no incluya las columnas que se quitaron. También puedes usar el trabajo de carga para reemplazar la tabla existente.

Ventajas

  • No generas cargos por el trabajo de exportación o de carga. Por el momento, los trabajos de carga y exportación de BigQuery son gratuitos.
  • Si usas el trabajo de carga a fin de reemplazar la tabla original, generas costos de almacenamiento para una tabla en vez de dos, pero pierdes los datos originales.

Desventajas

  • Si cargas los datos en una tabla nueva, generas costos de almacenamiento para la tabla original y la tabla nueva (excepto si borras la anterior).
  • Generas costos por almacenar los datos exportados en Cloud Storage.

Ejemplo SELECT * EXCEPT

En el ejemplo siguiente se muestra una consulta de SQL estándar que selecciona todos los datos en mydataset.mytable excepto column_two. El resultado de la consulta se usa para reemplazar la tabla existente.

Console

  1. En GCP Console, haz clic en Redactar consulta nueva.

  2. En el Editor de consultas, ingresa la siguiente consulta para seleccionar todos los datos de mydataset.mytable excepto column_two. mydataset.mytable está en tu proyecto predeterminado.

    SELECT
     * EXCEPT(column_two)
    FROM
     mydataset.mytable
    
  3. Haz clic en Más y selecciona Configuración de consulta.

  4. En la sección Destino, marca Establecer una tabla de destino para los resultados de la consulta.

  5. Haz lo que se indica para los siguientes campos:

    1. En Nombre del proyecto, deja el valor establecido en tu proyecto predeterminado. Este es el proyecto que contiene mydataset.mytable.

    2. En Nombre del conjunto de datos, elige mydataset.

    3. En el campo Nombre de tabla, ingresa mytable.

    4. Haz clic en Aceptar.

  6. En la sección Preferencia de escritura de la tabla de destino, para Preferencia de escritura, elige Reemplazar tabla. Esto reemplazará mytable por los resultados de la consulta.

  7. En Ubicación de procesamiento, haz clic en Selección automática y elige la ubicación de tus datos (opcional).

  8. Haz clic en Guardar para actualizar la configuración y, luego, en el Editor de consultas, haz clic en Ejecutar. Cuando se completa el trabajo de la consulta, la tabla ahora incluye todas las columnas excepto column_two.

IU clásica

  1. En la IU web clásica de BigQuery, haz clic en Redactar consulta.

  2. En el cuadro Consulta nueva, ingresa la siguiente consulta para seleccionar todos los datos de mydataset.mytable excepto column_two. mydataset.mytable está en tu proyecto predeterminado.

    #standardSQL
    SELECT
     * EXCEPT(column_two)
    FROM
     mydataset.mytable
    
  3. Haz clic en Mostrar opciones.

  4. En la sección Tabla de destino, haz clic en Seleccionar tabla.

  5. En el cuadro de diálogo Seleccionar tabla de destino, haz lo siguiente:

    1. Para Proyecto, deja el valor establecido en tu proyecto predeterminado. Este es el proyecto que contiene mydataset.mytable.

    2. En Conjunto de datos, elige mydataset.

    3. En el campo ID de tabla, ingresa mytable.

    4. Haz clic en Aceptar.

  6. En la sección Tabla de destino, para Preferencia de escritura, elige Reemplazar tabla. Esto reemplazará mytable porlos resultados de la consulta.

  7. En Ubicación de procesamiento, haz clic en Sin especificar y elige la ubicación de tus datos (opcional).

  8. Haz clic en Ejecutar consulta. Cuando se completa el trabajo de la consulta, la tabla ahora incluye todas las columnas excepto column_two.

CLI

Ingresa el comando siguiente bq query para seleccionar todos los datos de mydataset.mytable excepto column_two. mydataset.mytable está en tu proyecto predeterminado. Los resultados de la consulta están escritos en mydataset.mytable con la marca --destination_table y la marca --replace se usa para reemplazar mytable. Especifica la marca use_legacy_sql=false para usar la sintaxis de SQL estándar.

Proporciona la marca --location y configura el valor como tu ubicación (opcional).

bq query \
--destination_table mydataset.mytable \
--replace \
--use_legacy_sql=false \
'SELECT
  * EXCEPT(column_two)
FROM
  mydataset.mytable'

API

Para seleccionar todos los datos de mydataset.mytable excepto column_two, llama al método jobs.insert y configura un trabajo de query. Especifica tu ubicación en la propiedad location de la sección jobReference (opcional).

La consulta de SQL usada en el trabajo de consulta sería la siguiente: SELECT * EXCEPT(column_two) FROM mydataset.mytable.

Para reemplazar mytable por los resultados de la consulta, debes incluir mydataset.mytable en la propiedad configuration.query.destinationTable y especificar WRITE_TRUNCATE en la propiedad configuration.query.writeDisposition.

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Si necesitas ayuda, visita nuestra página de asistencia.