Amazon Redshift dejará de admitir la creación de nuevas UDF de Python a partir del 1 de noviembre de 2025. Si desea utilizar las UDF de Python, créelas antes de esa fecha. Las UDF de Python existentes seguirán funcionando con normalidad. Para obtener más información, consulte la publicación del blog
Uso de COPY para cargar datos en columnas SUPER
En las secciones siguientes, puede obtener información acerca de diferentes formas de utilizar el comando COPY para cargar datos JSON en Amazon Redshift. Para obtener información sobre los parámetros de formato de datos que Amazon Redshift utiliza para analizar JSON en los comandos COPY, lea la descripción del parámetro JSON format for COPY en Parámetros de formato de datos.
Temas
Copia de datos de JSON y Avro
Amazon Redshift proporciona los métodos siguientes para ingerir un documento JSON mediante el uso de COPY, incluso con una estructura JSON que sea total o parcialmente desconocida:
-
Almacene los datos que derivan de un documento JSON en una sola columna de datos SUPER mediante la opción
noshred. Este método es útil cuando el esquema no es conocido o se espera que cambie. Por lo tanto, este método hace que sea más fácil almacenar la tupla completa en una sola columna SUPER. -
Fragmente el documento JSON en varias columnas de Amazon Redshift mediante la opción
autoojsonpaths. Los atributos pueden ser escalares de Amazon Redshift o valores SUPER.
Puede utilizar estas opciones con los formatos JSON o Avro. Para obtener más información sobre las opciones de JSON, como noshred, auto y jsonpaths, consulte JSON format for COPY.
El tamaño máximo de un objeto JSON en Amazon Redshift es de 4 MB, que se aplica antes de realizar cualquier fragmentación o análisis.
Método 1: copia de un documento JSON en una única columna de datos SUPER con noshred
Puede copiar documentos JSON completos en columnas de datos SUPER individuales mediante la opción noshred del comando COPY. Considere el siguiente ejemplo:
Cree una tabla con una única columna de datos SUPER.
CREATE TABLE region_nations_noshred (rdata SUPER);Copie los datos de Amazon S3 en la única columna de datos SUPER. Para capturar los datos de origen JSON en una sola columna de datos SUPER, especifique la opción
noshreden la cláusula FORMAT JSON.COPY region_nations_noshred FROM 's3://redshift-downloads/semistructured/tpch-nested/data/json/region_nation' REGION 'us-east-1' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3' FORMAT JSON 'noshred';Después de que COPY haya capturado correctamente el JSON, su tabla tendrá una columna de datos SUPER
rdataque contendrá los datos de todo el objeto JSON. Los datos capturados mantienen todas las propiedades de la jerarquía JSON. Sin embargo, las hojas se convierten en tipos escalares de Amazon Redshift para el procesamiento eficiente de la consulta.Utilice la siguiente consulta para recuperar la cadena JSON original.
SELECT rdata FROM region_nations_noshred;Cuando Amazon Redshift genera una columna de datos SUPER, se puede acceder a ella usando JDBC como cadena a través de la serialización JSON. Para obtener más información, consulte Serialización de datos JSON anidados y complejos.
Método 2: copia de un documento JSON en varias columnas de datos SUPER
Puede fragmentar un documento JSON en varias columnas que pueden ser columnas de datos SUPER o tipos escalares de Amazon Redshift. Amazon Redshift propaga diferentes partes del objeto JSON a diferentes columnas. Considere el siguiente ejemplo:
Cree una tabla con varias columnas para almacenar el JSON triturado.
CREATE TABLE region_nations ( r_regionkey smallint ,r_name varchar ,r_comment varchar ,r_nations super );Para copiar JSON en la tabla
region_nations, especifique la opción AUTO en la cláusula FORMAT JSON para dividir el valor JSON en varias columnas. COPY hace coincidir los atributos JSON de nivel superior con los nombres de las columnas y permite que los valores anidados se capturen como valores SUPER, por ejemplo, matrices y objetos JSON.COPY region_nations FROM 's3://redshift-downloads/semistructured/tpch-nested/data/json/region_nation' REGION 'us-east-1' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3' FORMAT JSON 'auto';Cuando los nombres de atributos JSON están en mayúsculas y minúsculas combinadas, especifique la opción
auto ignorecaseen la cláusula FORMAT JSON. Para obtener más información acerca del comando COPY, consulte Carga desde datos JSON con la opción 'auto ignorecase'.
En algunos casos, hay una incompatibilidad entre los nombres de las columnas y los atributos JSON o el atributo que se va a cargar está anidado a más que un nivel de profundidad. Si es así, use un archivo jsonpaths para asignar manualmente los atributos JSON a las columnas de Amazon Redshift. Considere el siguiente ejemplo:
Cree una tabla con varias columnas para almacenar el JSON triturado.
CREATE TABLE region_nations ( r_regionkey smallint ,r_name varchar ,r_comment varchar ,r_nations super );-
En este caso, los nombres de columna no coinciden con los atributos JSON. Puede crear un archivo
jsonpathsque asigne las rutas de los atributos a las columnas de la tabla por su posición en la matriz dejsonpaths, como la siguiente:{"jsonpaths": [ "$.r_regionkey", "$.r_name", "$.r_comment", "$.r_nations ] } -
Use la ubicación del archivo
jsonpathscomo argumento para la opción FORMAT JSON en COPY.COPY nations FROM 's3://redshift-downloads/semistructured/tpch-nested/data/json/region_nation' REGION 'us-east-1' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3' FORMAT JSON 's3://redshift-downloads/semistructured/tpch-nested/data/jsonpaths/nations_jsonpaths.json'; -
Utilice la siguiente consulta para acceder a la tabla que muestra los datos distribuidos en varias columnas. Las columnas de datos SUPER se imprimen mediante el formato JSON.
SELECT r_regionkey,r_name,r_comment,r_nations[0].n_nationkey FROM region_nations ORDER BY 1,2,3 LIMIT 1;
Los archivos jsonpaths asignan los campos del documento JSON a columnas de la tabla. Puede extraer columnas adicionales, como claves de distribución y ordenación, mientras sigue cargando el documento completo en una columna SUPER. La siguiente consulta carga el documento completo en la columna nations. La columna name es la clave de ordenación y la columna regionkey es la clave de distribución. Considere el siguiente ejemplo:
Cree una tabla con varias columnas para almacenar el JSON triturado.
CREATE TABLE nations_sorted ( regionkey smallint, name varchar, nations super ) DISTKEY(regionkey) SORTKEY(name);Asigne la raíz jsonpath «$» a la raíz del documento de la siguiente manera:
{"jsonpaths": [ "$.r_regionkey", "$.r_name", "$" ] }Use la ubicación del archivo
jsonpathscomo argumento para la opción FORMAT JSON en COPY.COPY nations_sorted FROM 's3://redshift-downloads/semistructured/tpch-nested/data/json/region_nation' REGION 'us-east-1' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3' FORMAT JSON 's3://redshift-downloads/semistructured/tpch-nested/data/jsonpaths/nations_sorted_jsonpaths.json';
Para obtener más información sobre el uso de jsonpaths, consulte COPY de formato JSON.
Copia de datos desde texto y CSV
Amazon Redshift representa las columnas SUPER en formatos de texto y CSV como objetos JSON serializados. Se requiere un formato JSON válido para que las columnas SUPER se carguen con el tipo de información correcto. Elimine las comillas de los objetos, las matrices, los números, los valores booleanos y los valores nulos. Ajuste los valores de cadena con comillas dobles. Las columnas SUPER utilizan normas de escape estándar para los formatos de texto y CSV.
Al copiar desde CSV, a los delimitadores se les aplica un carácter de escape según el formato CSV estándar. Considere el siguiente ejemplo:
CREATE TABLE region_nations ( r_regionkey smallint ,r_name varchar ,r_comment varchar ,r_nations super ); COPY region_nations FROM 's3://redshift-downloads/semistructured/tpch-nested/data/csv/region_nation' REGION 'us-east-1' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3' FORMAT CSV;
Al copiar desde texto, si el delimitador elegido también puede aparecer en un campo SUPER, utilice la opción ESCAPE durante las operaciones COPY y UNLOAD. Considere el siguiente ejemplo:
CREATE TABLE region_nations ( r_regionkey smallint ,r_name varchar ,r_comment varchar ,r_nations super ); COPY region_nations FROM 's3://redshift-downloads/semistructured/tpch-nested/data/text/region_nation' REGION 'us-east-1' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3' DELIMITER ',' ESCAPE;
Copia de datos de Parquet y ORC en formato de columnas
Si los datos semiestructurados o anidados ya están disponibles en formato Apache Parquet o Apache ORC, puede utilizar el comando COPY para ingerir datos en Amazon Redshift.
La estructura de la tabla de Amazon Redshift debe coincidir con el número de columnas y con los tipos de datos de las columnas de los archivos Parquet u ORC. Si especifica SERIALIZETOJSON en el comando COPY, puede cargar cualquier tipo de columna en el archivo que se alinee con una columna SUPER de la tabla como SUPER. Esto incluye tipos de estructura y matriz.
En el ejemplo siguiente, se utiliza un formato Parquet:
COPY region_nations FROM 's3://redshift-downloads/semistructured/tpch-nested/data/parquet/region_nation' REGION 'us-east-1' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3' FORMAT PARQUET SERIALIZETOJSON;
En el siguiente ejemplo, se utiliza un formato ORC.
COPY region_nations FROM 's3://redshift-downloads/semistructured/tpch-nested/data/orc/region_nation' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3' FORMAT ORC SERIALIZETOJSON;
Cuando los atributos de los tipos de datos de fecha u hora están en ORC, Amazon Redshift los convierte en varchar luego de codificarlos en SUPER.