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.
Puede especificar si desea almacenar su archivo en su espacio personal o en un espacio compartido donde tenga permisos de escritura. Si lo almacena en un espacio compartido, los miembros pueden usar esos datos para crear apps en ese espacio. Vea: Administrar permisos en espacios compartidos.
Argumentos:
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. Para obtener información específica sobre lo que se considera una ruta válida, consulte Reglas para unas rutas válidas de las carpetas en los espacios. En Analítica de Qlik Cloud, se admiten estructuras jerárquicas de carpetas y se puede hacer referencia a ellas en la sntencia. Ejemplos:
Más información y ejemplos en Almacenar archivos en espacios de Analítica de Qlik Cloud. |
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.
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:
Ejemplo: Store mytable into [lib://DataFiles/myfile.parquet] (parquet, compression is lz4); |
Ejemplos:
Store mytable into [lib://DataFiles/xyz.qvd];
Store * from mytable into [lib://DataFiles/myfile.qvd];
Store Name, RegNo from mytable into [lib://DataFiles/xyz.qvd];
Store Name as a, RegNo as b from mytable into [lib://DataFiles/myfile.qvd];
Store mytable into [lib://DataFiles/myfile.txt] (txt);
Store mytable into [lib://DataFiles/myfile.parquet] (parquet);
Store * from mytable into [lib://DataFiles/myfile.csv] (txt);
Store * from mytable into [lib://TeamSharedSpace:DataFiles/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.
NoConcatenate LOAD num, text, Text(mixed) as mixed RESIDENT Data; STORE Format INTO [lib://DataFiles/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.
Etiqueta de control | Dual | Tipo físico | Tipo lógico | Tipo convertido |
---|---|---|---|---|
$parquet-boolean | Número | BOOLEAN | NONE | NONE |
$parquet-int32 | Número | INT32 | NONE | NONE |
$parquet-int64 | Número | INT64 | NONE | NONE |
$parquet-float | Número | FLOAT | NONE | NONE |
$parquet-double | Número | DOUBLE | NONE | NONE |
$parquet-bytearray | Cadena | BYTE_ARRAY | NONE | UTF8 |
$parquet-bytearrayfix | Número | FIXED_LEN_BYTE_ARRAY | NONE | DECIMAL |
$parquet-decimal | Número | INT64 | DECIMAL | DECIMAL |
$parquet-date | Número | INT32 | DATE | DATE |
$parquet-time | Número | INT64 | TIME | TIME_MICROS |
$parquet-timestamp | Número | INT64 | TIMESTAMP | TIMESTAMP_MICROS |
$parquet-string | Cadena | BYTE_ARRAY | STRING | UTF8 |
$parquet-enum | Cadena | BYTE_ARRAY | ENUM | ENUM |
$parquet-interval | Número | FIXED_LEN_BYTE_ARRAY | INTERVAL | INTERVAL |
$parquet-json | Cadena | BYTE_ARRAY | JSON | JSON |
$parquet-bson | Cadena | BYTE_ARRAY | BSON | BSON |
$parquet-uuid | Cadena | FIXED_LEN_BYTE_ARRAY | UUID | NONE |
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.
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.
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
El archivo Parquet resultante tiene el siguiente esquema:
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.
Almacenar archivos en espacios de Analítica de Qlik Cloud
Cuando utiliza una sentencia Store en un script de carga en Qlik Cloud, puede hacer referencia a la carpeta exacta en un espacio donde desea almacenar los archivos creados. Siga las reglas especificadas para unas Rutas válidas de carpetas de espacios. Además, los siguientes comportamientos también se aplican y son exclusivos de las sentencias Store:
Si el espacio existe pero la ruta de carpeta especificada no existe, la ruta se creará en el espacio. Es posible que se creen una o varias carpetas en función de la estructura de carpetas definida. El archivo se genera y se almacena allí.
Si el espacio existe pero la ruta de carpeta especificada utiliza delimitadores de carpeta no válidos (por ejemplo, \, \\, //, /./ o /../), se seguirá ejecutando la sentencia Store. En cambio, el archivo de salida se guardará en la ruta de nivel superior en el espacio de destino y tendrá un nombre que contiene su ruta completa, no solo el nombre especificado.
Si el espacio no existe, la sentencia Store no podrá ejecutarse y dará error.
Los ejemplos siguientes demuestran cómo hacer referencia a una ruta específica de carpeta en el espacio dentro de su sentencia Store.
Ejemplo: Almacenar un archivo en la ruta de nivel superior de un espacio
En este ejemplo, la tabla completa mytable se exporta a Analítica de Qlik Cloud como un archivo denominado myfile.qvd. El archivo se añade al espacio compartido TeamSharedSpace. El archivo no se encuentra dentro de ninguna carpeta específica, sino que se encuentra en la ruta de nivel superior del espacio.
Store * from mytable into [lib://TeamSharedSpace:DataFiles/myfile.qvd];
Ejemplo: Almacenar un archivo en una ruta específica de carpeta dentro de un espacio
En este ejemplo, la tabla completa mytable se exporta a Analítica de Qlik Cloud como un archivo llamado myfile.qvd. El archivo se añade a la carpeta SalesData dentro del espacio TeamSharedSpace.
Store * from mytable into [lib://TeamSharedSpace:DataFiles/SalesData/myfile.qvd];
Para obtener más información sobre cómo hacer referencia a la estructura de carpetas de espacio en los scripts de carga, consulte Hacer referencia a la estructura de carpetas del espacio en el desarrollo de apps y scripts.