Cambia esquemas de tablas manualmente

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 de REQUIRED a NULLABLE)
  • Borrar una columna

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

Cambia el nombre de una columna

El cambio de nombre de una columna no es compatible con la IU web BigQuery, la herramienta de línea de comandos o la API. Si tratas de actualizar un esquema de tabla mediante una columna renombrada, se muestra el error siguiente: BigQuery error in update operation: Provided Schema does not match Table [PROJECT_ID]:[DATASET].[TABLE].

Hay dos maneras de renombrar de forma manual 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

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 súbelos a una tabla nueva

También puedes renombrar una columna si exportas los datos de tu tabla a Google Cloud Storage y, luego, cargas los datos en una tabla nueva con una definición de esquema que contiene 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.

IU web

  1. En la IU web 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 por las dos columnas que se necesitan 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. Para 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 con los resultados de la consulta.

  7. Para Ubicación de procesamiento, haz clic en Sin especificar y elige la ubicación de tus datos. Puedes dejar la ubicación de procesamiento sin especificar si tus datos están en la ubicación multirregional US o EU. Cuando tus datos están en US o EU, la ubicación de procesamiento se detecta de manera automática.

  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 establece el valor en tu ubicación.

bq --location=[LOCATION] 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 de column_two a newcolumn_two, llama al método jobs.insert y configura un trabajo de consulta. Especifica tu región en la propiedad location de la sección jobReference.

La consulta de SQL usada en el trabajo de consulta sería: 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 con los resultados de la consulta, incluye mydataset.mytable en la propiedad configuration.query.destinationTable y especifica 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

El cambio de nombre de una columna no es compatible con la IU web BigQuery, la herramienta de línea de comandos o la API. Si tratas de actualizar una tabla mediante la aplicación de un esquema que especifique un tipo de datos nuevos para una columna, se muestra el error siguiente: 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 súbelos a una tabla nueva

También puedes cambiar el tipo de datos de una columna si exportas los datos de tu tabla a Google Cloud Storage y, luego, cargas los datos en una tabla nueva con una definición de esquema que especifique el tipo de datos correctos 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 Transmisión en la documentación de referencia de operadores y funciones.

IU web

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

  2. En el cuadro Consulta nueva, ingresa la consulta siguiente 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 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. Para 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 con los resultados de la consulta.

  7. Para Ubicación de procesamiento, haz clic en Sin especificar y elige la ubicación de tus datos. Puedes dejar la ubicación de procesamiento sin especificar si tus datos están en la ubicación multirregional US o EU. Cuando tus datos están en US o EU, la ubicación de procesamiento se detecta de manera automática.

  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 establece el valor en tu ubicación.

bq --location=[LOCATION] 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 trasmitir column_one desde DATE a STRING, llama al método jobs.insert y configura un trabajo de consulta. Especifica tu región en la propiedad location de la sección jobReference.

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

Para reemplazar mytable con los resultados de la consulta, incluye mydataset.mytable en la propiedad configuration.query.destinationTable y especifica WRITE_TRUNCATE en la propiedad configuration.query.writeDisposition.

Cambia el nombre 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 cómo relajar las columnas REQUIRED a NULLABLE, consulta Disminuye la rigurosidad del modo de una columna.

Si tratas de aplicar un cambio sin compatibilidad 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 súbelos a una tabla nueva

Puedes cambiar el modo de una columna de manera manual si exportas los datos de tu tabla a Google 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

El borrado de una columna de un esquema de una tabla existente no es compatible por la IU web de BigQuery, la herramienta de línea de comandos o la API. Si tratas de actualizar una tabla mediante la aplicación de un esquema que quite una columna, se muestra el error siguiente: BigQuery error in update operation: Provided Schema does not match Table [PROJECT_ID]:[DATASET].[TABLE].

Hay dos maneras de borrar de forma manual 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 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 súbelos a una tabla nueva

También puedes quitar una columna si exportas los datos de tu tabla a Google Cloud Storage, cuando borras los datos correspondientes a la columna (o columnas) que quieres quitar y luego cargas los datos en una tabla nueva con una definición de esquema que no contiene las columnas quitadas. 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.

IU web

  1. En la IU web 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 mydataset.mytable. column_two 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. Para 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 con los resultados de la consulta.

  7. Para Ubicación de procesamiento, haz clic en Sin especificar y elige la ubicación de tus datos. Puedes dejar la ubicación de procesamiento sin especificar si tus datos están en la ubicación multirregional US o EU. Cuando tus datos están en US o EU, la ubicación de procesamiento se detecta de manera automática.

  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 establece el valor en tu ubicación.

bq --location=[LOCATION] 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 consulta. Especifica tu región en la propiedad location de la sección jobReference.

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

Para reemplazar mytable con los resultados de la consulta, incluye mydataset.mytable en la propiedad configuration.query.destinationTable y especifica 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.