COPY de formato JSON - Amazon Redshift

COPY de formato JSON

La estructura de datos JSON se compone de un conjunto de objetos o matrices. Un objeto JSON comienza y termina con llaves, y contiene una colección desordenada de pares de nombre-valor. Cada nombre y valor está separado por dos puntos y los pares están separados por comas. El nombre es una cadena entre comillas dobles. Los caracteres de comillas deben ser comillas simples (0x22), no las comillas inclinadas o “inteligentes”.

Una matriz JSON comienza y termina con corchetes y contiene una colección ordenada de valores separados por comas. Un valor puede ser una cadena entre comillas dobles, un número, un booleano true o false, nulo, un objeto JSON o una matriz.

Los objetos y las matrices JSON se pueden anidar, lo que habilita una estructura jerárquica de datos. En el siguiente ejemplo, se muestra una estructura de datos JSON con dos objetos válidos.

{ "id": 1006410, "title": "Amazon Redshift Database Developer Guide" } { "id": 100540, "name": "Amazon Simple Storage Service User Guide" }

En el siguiente se muestran los mismos datos como dos matrices JSON.

[ 1006410, "Amazon Redshift Database Developer Guide" ] [ 100540, "Amazon Simple Storage Service User Guide" ]

Opciones de COPY para JSON

Cuando utilice COPY con datos en formato JSON, puede especificar las siguientes opciones:

  • 'auto' : COPY carga de forma automática los campos del archivo JSON.

  • 'auto ignorecase': COPY carga de forma automática los campos del archivo JSON mientras ignora las mayúsculas y las minúsculas de los nombres de los campos.

  • s3://jsonpaths_file: COPY utiliza un archivo JSONPaths para analizar los datos de origen JSON. Un archivo JSONPaths es un archivo de texto que contiene un solo objeto JSON con el nombre "jsonpaths" combinado con una matriz de expresiones JSONPath. Si el nombre es cualquier cadena diferente a "jsonpaths", COPY utiliza el argumento 'auto' en lugar de utilizar el archivo JSONPaths.

Por obtener ejemplos que muestren cómo cargar datos mediante 'auto', 'auto ignorecase' o un archivo JSONPaths, y mediante matrices y objetos JSON, consulte Ejemplos de Copy de JSON.

Opción JSONPath

En la sintaxis de COPY de Amazon Redshift, una expresión JSONPath especifica la ruta explícita a un elemento de nombre único en una estructura de datos jerárquica JSON, mediante notaciones con corchetes o con puntos. Amazon Redshift no admite ningún elemento de JSONPath, como caracteres comodín o expresiones de filtro, que pueda resolverse como una ruta ambigua o como varios elementos de nombre. Por este motivo, Amazon Redshift no puede analizar estructuras de datos complejas de varios niveles.

El siguiente es un ejemplo de un archivo JSONPaths con expresiones JSONPath que utilizan la notación con corchetes. El símbolo de dólar ($) representa la estructura de nivel raíz.

{ "jsonpaths": [ "$['id']", "$['store']['book']['title']", "$['location'][0]" ] }

En el ejemplo anterior, $['location'][0] hace referencia al primer elemento de una matriz. JSON utiliza la indexación de matrices de base cero. Los índices de matriz deben ser números enteros positivos (igual o mayor que cero).

En el siguiente ejemplo, se muestra el archivo JSONPaths anterior que utiliza la notación con puntos.

{ "jsonpaths": [ "$.id", "$.store.book.title", "$.location[0]" ] }

No puede combinar las notaciones con corchetes y con puntos en la matriz jsonpaths. Los corchetes se pueden utilizar en la notación con corchetes y en la notación con puntos para hacer referencia a un elemento de matriz.

Cuando se utiliza la notación con puntos, las expresiones JSONPath no pueden contener los siguientes caracteres:

  • Comilla simple recta ( ' )

  • Punto (.)

  • Corchetes ( [ ] ), a menos que se utilice para hacer referencia a una elemento de matriz

Si el valor del par de nombre-valor indicado por una expresión JSONPath es un objeto o una matriz, todo el objeto o la matriz se carga como una cadena, incluidos los corchetes o las llaves. Por ejemplo, suponga que los datos JSON contienen el siguiente objeto.

{ "id": 0, "guid": "84512477-fa49-456b-b407-581d0d851c3c", "isActive": true, "tags": [ "nisi", "culpa", "ad", "amet", "voluptate", "reprehenderit", "veniam" ], "friends": [ { "id": 0, "name": "Martha Rivera" }, { "id": 1, "name": "Renaldo" } ] }

La expresión JSONPath $['tags'] luego devuelve el siguiente valor.

"["nisi","culpa","ad","amet","voluptate","reprehenderit","veniam"]"

La expresión JSONPath $['friends'][1] luego devuelve el siguiente valor.

"{"id": 1,"name": "Renaldo"}"

Cada expresión JSONPath de la matriz jsonpaths corresponde a una columna de la tabla de destino de Amazon Redshift. El orden de los elementos de la matriz jsonpaths debe coincidir con el orden de las columnas en la tabla de destino o en la lista de columnas, si se utiliza una.

Por obtener ejemplos que muestren cómo cargar datos utilizando un argumento 'auto' o un archivo JSONPaths y cómo utilizar los objetos y matrices JSON, consulte Ejemplos de Copy de JSON.

Para obtener información sobre cómo copiar varios archivos JSON, consulte Uso de un manifiesto para especificar archivos de datos.

Caracteres de escape en JSON

COPY carga \n como un carácter de línea nueva y \t como un tabulador. Para cargar una barra oblicua inversa, aplique escape con una barra oblicua inversa ( \\ ).

Suponga, por ejemplo, que tiene el siguiente JSON en un archivo denominado escape.json en el bucket s3://amzn-s3-demo-bucket/json/.

{ "backslash": "This is a backslash: \\", "newline": "This sentence\n is on two lines.", "tab": "This sentence \t contains a tab." }

Ejecute los siguientes comandos para crear la tabla ESCAPES y cargar el JSON.

create table escapes (backslash varchar(25), newline varchar(35), tab varchar(35)); copy escapes from 's3://amzn-s3-demo-bucket/json/escape.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format as json 'auto';

Consulte la tabla ESCAPES para ver los resultados.

select * from escapes; backslash | newline | tab ------------------------+-------------------+---------------------------------- This is a backslash: \ | This sentence | This sentence contains a tab. : is on two lines. (1 row)

Pérdida de precisión numérica

Puede perder precisión al cargar números de archivos de datos en formato JSON a una columna definida como tipo de datos numéricos. Algunos valores de coma flotante no se representan exactamente igual en distintos sistemas informáticos. Por ello, es posible que los datos que copie de un archivo JSON no se redondeen según lo esperado. Para evitar una pérdida de precisión, le recomendamos que utilice una de las siguientes alternativas:

  • Represente el número como una cadena encerrando el valor entre comillas dobles.

  • Use ROUNDEC para redondear el número en lugar de truncarlo.

  • En vez de utilizar archivos JSON o Avro, use archivos CSV, de ancho fijo o delimitados por caracteres.