Saltar al contenido principal Saltar al contenido complementario

Store

La sentencia Store crea un archivo QVD, Parquet, CSV o TXT.

Sintaxis:  

Store [ fieldlist from] table into filename [ format-spec ];

La sentencia creará un archivo denominado explícitamente QVD, Parquet o archivo de texto.

La sentencia solo puede exportar campos de una tabla de datos, a menos que esté almacenando en archivos Parquet. Si los campos de varias tablas se van a exportar a un archivo QVD, CSV o TXT, se debe hacer un join explícito previamente en el script para crear la tabla de datos que se debe exportar. Puede almacenar varias tablas en un solo Parquet nidando los datos en los archivos Parquet.

Los valores de texto se exportan al archivo CSV en UTF-8 con el formato BOM. Se puede especificar un delimitador, vea LOAD. La sentencia store a un CSV no admite exportación BIFF.

Nota informativaEn algunos casos, con datos que no están bien formados, los campos estarán entre comillas dobles para garantizar que los datos se interpreten correctamente. Esto puede suceder, por ejemplo, cuando el campo contiene caracteres como comillas, comas, espacios o saltos de línea.

Argumentos:  

Argumentos de la sentencia Store
Argumento Descripción
fieldlist::= ( * | field) { , field } )

Una lista de los campos que se van a seleccionar. Usar un asterisco * indica la totalidad de campos. 

field::= fieldname [as aliasname ]

fieldname es un texto que es idéntico a un nombre de campo en table. (Tenga en cuenta que el nombre de campo debe ir entre comillas dobles rectas o corchetes si contiene por ejemplo espacios u otros caracteres no estándar.)

aliasname es un nombre alternativo para el campo que se utilizará en el archivo QVD o CSV resultante.

table Es una tabla etiquetada en el script, ya cargada, que se usará como fuente de datos.
filename

El nombre del archivo destino, incluyendo una ruta válida a una conexión de datos de carpetas.

Ejemplo: 'lib://Table Files/target.qvd'

En el modo de elaboración de scripts de legado, se admiten también los diguientes formatos de ruta:

  • Absoluta

    Ejemplo: c:\data\sales.qvd

  • relativa al directorio de trabajo de la app Qlik Sense.

    Ejemplo: data\sales.qvd

    Si se omite la ruta, Qlik Sense almacena el archivo en el directorio especificado por la sentencia Directory. Si no hay sentencia Directory, Qlik Sense almacena el archivo en el directorio de trabajo, C:\Users\{user}\Documents\Qlik\Sense\Apps.

format-spec ::=( ( txt | qvd | parquet), compression is codec)

Puede establecer la especificación de formato en cualquiera de estos formatos de archivo. Si se omite la especificación de formato, se asume qvd.

  • txt para archivos CSV y TXT.

  • qvd para archivos QVD.

  • parquet para archivos Parquet.

Si utiliza parquet, también puede establecer qué códec de compresión usar con compression is. Si no especifica el códec de compresión con compresión con compression is, se utiliza snappy. Están disponibles las siguientes opciones de compresión:

  • uncompressed

  • snappy

  • gzip

  • lz4

  • brotli

  • zstd

  • lz4_hadoop

Ejemplo:

Store mytable into [lib://AttachedFiles/myfile.parquet] (parquet, compression is lz4);

Ejemplos:

Store mytable into xyz.qvd (qvd);

Store * from mytable into 'lib://FolderConnection/myfile.qvd';

Store Name, RegNo from mytable into xyz.qvd;

Store Name as a, RegNo as b from mytable into 'lib://FolderConnection/myfile.qvd';

Store mytable into myfile.txt (txt);

Store mytable into [lib://FolderConnection/myfile.csv] (txt);

Store mytable into myfile.parquet (parquet);

Store * from mytable into 'lib://FolderConnection/myfile.qvd';

Almacenamiento en archivos parquet

Parquet es un formato de archivo fuertemente tipado, en el que cada campo contiene un único tipo específico de datos (como in32, double, timestamp o text). Qlik Sense almacena datos internos como un dual escrito libremente, donde los datos de diferentes fuentes se pueden mezclar en los mismos campos. Como solo se puede almacenar una parte del dual en cada campo de Parquet, es importante saber qué contiene cada campo. De forma predeterminada, Qlik Sense utiliza el tipo de campo para determinar cómo se debe almacenar el campo. Al almacenar datos en archivos Parquet en un formato específico, debe especificar qué tipo de datos son sus campos al cargarlos. Si trata de almacenar datos en campos incompatibles en un archivo Parquet, como números en un campo de texto o texto en un campo de marca de tiempo, terminará con valores nulos.

Al cargar datos que desea almacenar en Parquet, es posible cambiar el comportamiento predeterminado. Puede darles formato para cambiar su tipo de datos, o bien etiquetarlos para obligar a unos tipos de columnas específicos en Parquet.

Formateado de datos para almacenamiento en Parquet

Puede utilizar las funciones de formato de Qlik Sense para clasificar sus datos. Por ejemplo, Text(), Num(), Interval() o Timestamp() pueden aplicar formatos de datos al almacenar datos en Parquet. Qlik Sense puede almacenar datos en casi 20 tipos de datos según los atributos de campo y las etiquetas de campo automáticas. Para más información, vea Funciones de interpretación.

Ejemplo: Formateado de datos con Num() y Text()

El ejemplo siguiente demuestra la preparación de datos para su almacenamiento en Parquet. Num() se aplica al campo numérico. Text() se aplica tanto a texto como a mixto. En el caso de formato mixto, Text() evita que se trate como un campo numérico en Parquet y que los valores de texto se cambien a valores nulos.

Data: LOAD * INLINE [ num, text, mixed 123.321, abc, 123 456.654, def, xyz 789.987, ghi, 321 ]; Format:
NoConcatenate LOAD num, text, Text(mixed) as mixed RESIDENT Data; STORE Format INTO [lib://AttachedFiles/Tmp.parquet] (parquet);

Etiquetado de datos para almacenamiento en Parquet

Puede etiquetar sus datos con etiquetas $parquet para obligar a tener unos tipos de columnas específicos al almacenar datos en Parquet. Cada tipo de datos se puede aplicar agregando la etiqueta de control correspondiente. Por ejemplo, para almacenar un campo como INT32 en Parquet, etiquételo con $parquet-int32 en el script de carga. Dependiendo del tipo de datos, se almacenará la cadena o la representación numérica de los datos duales.

Las siguientes etiquetas de control de Parquet se pueden utilizar para etiquetar campos con el fin de almacenarlos en archivos Parquet.

Etiquetas de control de Parquet
Etiqueta de controlDualTipo físicoTipo lógicoTipo convertido
$parquet-booleanNúmeroBOOLEANNONENONE
$parquet-int32NúmeroINT32NONENONE
$parquet-int64NúmeroINT64NONENONE
$parquet-floatNúmeroFLOATNONENONE
$parquet-doubleNúmeroDOUBLENONENONE
$parquet-bytearrayCadenaBYTE_ARRAYNONEUTF8
$parquet-bytearrayfixNúmeroFIXED_LEN_BYTE_ARRAYNONEDECIMAL
$parquet-decimalNúmeroINT64DECIMALDECIMAL
$parquet-dateNúmeroINT32DATEDATE
$parquet-timeNúmeroINT64TIMETIME_MICROS
$parquet-timestampNúmeroINT64TIMESTAMPTIMESTAMP_MICROS
$parquet-stringCadenaBYTE_ARRAYSTRINGUTF8
$parquet-enumCadenaBYTE_ARRAYENUMENUM
$parquet-intervalNúmeroFIXED_LEN_BYTE_ARRAYINTERVALINTERVAL
$parquet-jsonCadenaBYTE_ARRAYJSONJSON
$parquet-bsonCadenaBYTE_ARRAYBSONBSON
$parquet-uuidCadenaFIXED_LEN_BYTE_ARRAYUUIDNONE

Ejemplo: Etiquetado de datos para almacenamiento en Parquet

En este ejemplo, se utilizan dos etiquetas para definir los datos de Parquet. El campo num va etiquetado con $parquet-int32 para definirlo como un campo numérico que se establecerá como INT32 en Parquet.

Data: LOAD * INLINE [ num, text, 123.321, abc 456.654, def 789.987, ghi ]; TAG num WITH '$parquet-int32'; STORE Format INTO [lib://AttachedFiles/Tmp.parquet] (parquet);

Almacenar datos anidados en archivos Parquet

Puede almacenar varias tablas en archivos Parquet anidándolas en datos estructurados. Store admite nodos estructurados y nodos de lista en un esquema en estrella. Las tablas individuales también se pueden almacenar en modo anidado utilizando el especificador Delimiter is.

Al almacenar tablas, especifique las tablas que desea incluir separadas por comas. Por ejemplo: STORE Table1, Table2, Table3 INTO [lib://<file location>/<file name>.parquet] (parquet);. Puede controlar qué campos se almacenan utilizando una lista de campos en la sentencia Store. Por ejemplo STORE Field1, Field2, FROM Table1, Table2 INTO [lib://<file location>/<file name>.parquet] (parquet);. Todos los campos de la lista de campos deben estar en una o más de las tablas enumeradas. La primera tabla de la sentencia Store se usará como tabla de hechos en el esquema en estrella.

Los nombres de los campos se utilizan para controlar cómo se crearán y anidarán los grupos. De forma predeterminada, los nombres de los campos se dividen en nodos con un punto. (.). El delimitador se puede cambiar configurando la variable del sistema FieldNameDelimiter o usando el especificador Delimiter is. El especificador anulará la variable del sistema.Para más información, vea Trabajar con variables en el editor de carga de datos.

Los nombres de los campos se dividen por el delimitador y las partes se utilizan para crear el esquema con grupos anidados. Por ejemplo, STORE Field1, Field1.Field2, Field1.Field3, Field1.Field4 FROM Table1 INTO [nested.parquet] (parquet, delimiter is '.'); creará dos grupos (Grupo1 y Grupo2) con Campo1, Campo2 y Campo3, Campo4.

Nota informativaEs posible que los grupos y campos no tengan el mismo nombre en un nodo del esquema. Por ejemplo, STORE Address, Address.Street INTO [nested.parquet] (parquet, delimiter is '.''); fallará porque Address es ambiguo y es a la vez un campo de datos y un grupo.

Al almacenar datos anidados en Parquet, las claves entre tablas se transforman en nodos de enlace en el esquema. Las tablas se transforman en nodos estructurados en el esquema.Puede anular la transformación predeterminada utilizando nombres de campos.

Ejemplo: Almacenar datos anidados en un archivo Parquet

company: LOAD * INLINE [ company, contact A&G, Amanda Honda Cabro, Cary Frank Fenwick, Dennis Fisher Camros, Molly McKenzie ]; salesrep: LOAD * INLINE [ company, salesrep A&G, Bob Park Cabro, Cezar Sandu Fenwick, Ken Roberts Camros, Max Smith ]; headquarter: LOAD * INLINE [ company, country, city A&G, USA, Los Angeles Cabro, USA, Albuquerque Fenwick, USA, Baltimore Camros, USA, Omaha ]; region: LOAD * INLINE [ region, city West, Los Angeles Southwest, Albuquerque East, Baltimore Central, Omaha ]; STORE company, salesrep, headquarter, region INTO [lib://AttachedFiles/company.parquet] (parquet) DROP TABLES company, salesrep, headquarter, region;

El archivo Parquet resultante tiene el siguiente esquema:

company (String) contact (String) company:salesrep (List) salesrep (Group) salesrep (String) company:headquarter (List) headquarter (Group) country (String) city (String) city:region (List) region (Group) region (String)

Limitaciones

El almacenamiento de datos anidados en Parquettiene las siguientes limitaciones:

  • El almacenamiento no admite nodos de mapas.

  • El almacenamiento no incluye campos clave generados al cargar archivos de parquet anidados.

  • No puede almacenar datos de tablas conjuntas que no estén vinculadas con campos clave.

  • El archivo anidado desnormaliza el modelo de datos. Los valores a los que no se hace referencia no se guardarán y los valores a los que se hace referencia varias veces se copiarán.

¿Esta página le ha sido útil?

No dude en indicarnos en qué podemos mejorar si encuentra algún problema en esta página o su contenido, como, por ejemplo, errores tipográficos, pasos que falta o errores técnicos.