INSERT (tabla externa)
Inserta los resultados de una consulta SELECT en tablas externas existentes en un catálogo externo, como para AWS Glue, AWS Lake Formation o un metastore de Apache Hive. Utilice el mismo rol de AWS Identity and Access Management (IAM) utilizado para el comando CREATE EXTERNAL SCHEMA para interactuar con catálogos externos y Amazon S3.
Para las tablas sin partición, el comando INSERT (tabla externa) escribe los datos en la ubicación de Amazon S3 definida en la tabla, en función de las propiedades de la tabla y el formato de archivo especificados.
Para las tablas con partición, INSERT (tabla externa) escribe datos en la ubicación de Amazon S3 de acuerdo con la clave de partición especificada en la tabla. También registra automáticamente nuevas particiones en el catálogo externo una vez finalizada la operación INSERT.
No se puede ejecutar INSERT (tabla externa) en un bloque de transacción (BEGIN … END). Para obtener más información acerca de las transacciones, consulte Aislamiento serializable.
Sintaxis
INSERT INTO external_schema.table_name { select_statement }
Parámetros
- external_schema.table_name
-
El nombre de un esquema externo existente y una tabla externa de destino en la que se va a insertar.
- select_statement
-
Una instrucción que inserta una o más filas en la tabla externa definiendo cualquier consulta. Todas las filas que produce la consulta se escriben en Amazon S3 en formato de texto o Parquet según la definición de la tabla. La consulta debe devolver una lista de columnas que sea compatible con los tipos de datos de columna de la tabla externa. No obstante, los nombres de columna no tienen que coincidir.
Notas de uso
El número de columnas de la consulta SELECT debe ser el mismo que la suma de las columnas de datos y las columnas de partición. La ubicación y el tipo de datos de cada columna de datos deben coincidir con los de la tabla externa. La ubicación de las columnas de partición debe estar al final de la consulta SELECT, en el mismo orden en que se definieron en el comando CREATE EXTERNAL TABLE. Los nombres de columna no tienen que coincidir.
En algunos casos, es posible que desee ejecutar el comando INSERT (tabla externa) en un catálogo de datos de AWS Glue o en un metastore de Hive. En el caso de AWS Glue, el rol de IAM utilizado para crear el esquema externo debe tener permisos de lectura y escritura en Amazon S3 y AWS Glue. Si utiliza un catálogo de AWS Lake Formation, este rol de IAM se convierte en el propietario de la nueva tabla de Lake Formation. Este rol de IAM debe tener al menos los permisos siguientes:
-
Permisos SELECT, INSERT, UPDATE en la tabla externa
-
Permiso de ubicación de datos en la ruta de Amazon S3 de la tabla externa
Para asegurarse de que los nombres de los archivos son únicos, Amazon Redshift utiliza el siguiente formato para el nombre de cada archivo cargado en Amazon S3 de manera predeterminada.
.<date>
_<time>
_<microseconds>
_<query_id>
_<slice-number>
_part_<part-number>
.<format>
Un ejemplo es 20200303_004509_810669_1007_0001_part_00.parquet
.
Tenga en cuenta lo siguiente al ejecutar el comando INSERT (tabla externa):
-
No se admiten tablas externas que tengan un formato distinto de PARQUET o TEXTFILE.
-
Este comando admite propiedades de tabla existentes como 'write.parallel', 'write.maxfilesize.mb', 'compression_type' y 'serialization.null.format'. Para actualizar esos valores, ejecute el comando ALTER TABLE SET TABLE PROPERTIES.
-
La propiedad de tabla 'numRows' se actualiza automáticamente hacia el final de la operación INSERT. La propiedad de tabla debe definirse o agregarse a la tabla si no se creó mediante la operación CREATE EXTERNAL TABLE AS.
-
La cláusula LIMIT no se admite en la consulta SELECT externa. En su lugar, utilice una cláusula LIMIT anidada.
-
Puede utilizar la tabla STL_UNLOAD_LOG para realizar un seguimiento de los archivos que se escribieron en Amazon S3 mediante cada operación INSERT (tabla externa).
Amazon Redshift solo es compatible con el cifrado estándar de Amazon S3 para INSERT (tabla externa).
Ejemplos de INSERT (tabla externa)
En el siguiente ejemplo, se insertan los resultados de la instrucción SELECT en la tabla externa.
INSERT INTO spectrum.lineitem SELECT * FROM local_lineitem;
En el siguiente ejemplo, se insertan los resultados de la instrucción SELECT en una tabla externa particionada mediante la partición estática. Las columnas de partición están codificadas de forma rígida en la instrucción SELECT. Las columnas de partición deben estar al final de la consulta.
INSERT INTO spectrum.customer SELECT name, age, gender, 'May', 28 FROM local_customer;
En el siguiente ejemplo, se insertan los resultados de la instrucción SELECT en una tabla externa particionada mediante la partición dinámica. Las columnas de partición no están codificadas de forma rígida. Los datos se agregan automáticamente a las carpetas de partición existentes o a las nuevas carpetas si se agrega una nueva partición.
INSERT INTO spectrum.customer SELECT name, age, gender, month, day FROM local_customer;