# Store

Store 语句创建 QVD、Parquet、CSV 或 TXT 文件。

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

该语句将创建一个明确命名的 QVD, Parquet，或文本文件。

该语句仅会从一个数据表格中导出字段，除非您正存储到 Parquet。如果要从多个表格中导出字段为 QVD、CSV 或 TXT 文件，必须明确命名之前在脚本中生成的 join 以创建应导出的数据表。通过在 Parquet 文件中嵌套数据，可以将多个表存储在一个 Parquet 中。

文本值将在 CSV 中以 UTF-8 格式导出至 BOM 文件。可以指定一个分隔符，请参阅 LOAD。store 语句不支持将 CSV 导出至 BIFF 文件。

信息注释在某些数据格式不正确的情况下，字段将被双引号包围，以确保数据得到正确解释。例如，当字段包含引号、逗号、空格或换行符等字符时，就会发生这种情况。

存储命令参数

| 参数 | 描述 |
| --- | --- |
| fieldlist::= ( \*<br>\| field) { , field } ) | 要选择的字段列表。使用 \* 作为字段列表，则其表示全部字段。<br><br>field::= fieldname<br>[as aliasname<br>]<br><br>fieldname是指与table中的字段名完全相同的文本。（请注意，如果字段名包含空格或其他非标准字符，则必须使用双引号或方括号括起来。）<br><br>aliasname 是指生成的 QVD 或 CSV 文件中所用字段的替代名称。 |
| table | 脚本标签表示要用作数据源的已加载表格。 |
| filename | 目标文件的名称，包括现有文件夹数据连接的有效路径。<br><br>示例： 'lib://Table Files/target.qvd'<br><br>在传统脚本模式下，同时支持以下路径格式：<br><br><ul> <li> <p>绝对</p> <p><span><span>示例： </span></span><span>c:\data\sales.qvd</span> </p> </li> <li> <p>相对于 <span>Qlik Sense</span> 应用程序 工作目录。</p> <p><span><span>示例： </span></span><span>data\sales.qvd</span> </p> <p>如果路径被省略，<span>Qlik Sense</span> 则在由 <span>Directory</span> 语句指定的目录中存储文件。如果没有 <span>Directory</span> 语句，那么 <span>Qlik Sense</span> 将在工作目录 <span>C:\Users\{user}\Documents\Qlik\Sense\Apps</span> 中存储文件。</p> </li> </ul> |
| format-spec ::=( ( txt \| qvd<br>\| Parquet)，压缩为 编解码器) | 您可以将格式规范设置为这些文件格式之一。如果省略格式规范，则假定为 qvd。<br><br><ul> <li> <p><span>txt</span> 和 <span>CSV</span> 文件的 <span>TXT</span>。</p> </li> <li> <p><span>qvd</span> 用于 <span>QVD</span> 文件。</p> </li> <li> <p><span>parquet</span> 用于 <span>Parquet</span> 文件。</p> </li> </ul><br><br>如果使用 parquet，还可以设置用于压缩为的压缩编解码器。如果不是用压缩为指定压缩编解码器，则使用 `snappy`。有以下压缩设置可用：<br><br><ul> <li> <p><code>uncompressed</code> </p> </li> <li> <p><code>snappy</code> </p> </li> <li> <p><code>gzip</code> </p> </li> <li> <p><code>lz4</code> </p> </li> <li> <p><code>brotli</code> </p> </li> <li> <p><code>zstd</code> </p> </li> <li> <p><code>lz4_hadoop</code> </p> </li> </ul><br><br>示例：<br><br>`Store mytable into [lib://AttachedFiles/myfile.parquet] (parquet, compression is lz4);` |

`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';`

## 存储在 Parquet 文件中

Parquet 是一种强类型文件格式，其中每个字段都包含一种特定类型的数据（如 in32、double、时间戳或文本）。Qlik Sense 将内部数据存储为松散类型的双重数据，其中来自不同来源的数据可以混合到同一字段中。由于 Parquet 中的每个字段中只能存储 dual 数据的一部分，因此了解每个字段包含的内容很重要。默认情况下，Qlik Sense 使用字段类型来确定字段的存储方式。以特定格式将数据存储在 Parquet 文件中时，必须指定加载字段时的数据类型。如果您试图将数据存储到 Parquet 文件中不兼容的字段中，例如文本字段中的数字或时间戳字段中的文本，则最终会得到 null 值。

加载要存储在 Parquet 中的数据时，可以更改默认行为。您可以格式化它以更改数据类型，也可以标记它以强制执行 Parquet 中的特定列类型。

### 格式化数据以存储在 Parquet 中

您可以使用 Qlik Sense 格式化功能对数据进行分类。例如，Text()、Num()、Interval() 或 Timestamp() 可以在 Parquet 中存储数据时强制执行数据格式。Qlik Sense 可以根据字段属性和自动字段标签将数据存储为近 20 种数据类型。有关更多信息，请参阅[解释函数](https://help.qlik.com/zh-CN/sense/May2026/Subsystems/Hub/Content/Sense_Hub/Scripting/InterpretationFunctions/interpretation-functions.htm)。

示例： 使用 Num() 和 Text() 进行格式设定

以下示例演示了准备数据以存储在 Parquet 中。Num() 应用于 num 字段。Text() 同时应用于文本和混合字段。在混合字段的情况下，Text() 防止将其视为 Parquet 中的数字字段，并将文本值更改为 null 值。

```

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);
```

### 标记数据以存储在 Parquet 中

在以 Parquet 中存储数据时，可以使用 `$parquet` 标记对数据进行标记，以强制使用特定的列类型。每种数据类型都可以通过添加相应的控制标签来强制执行。例如，要在 Parquet 中将字段存储为 INT32，请在加载脚本中将其标记为 `$parquet-int32`。根据数据类型，将存储字符串或 dual 数据的数字表示。

以下 Parqout 控制标记可用于标记存储在 Parquet 文件中的字段。

Parquet 控制标记 `$parquet-int64``$parquet-float``$parquet-double``$parquet-bytearray``$parquet-bytearrayfix``$parquet-decimal``$parquet-date``$parquet-time``$parquet-timestamp``$parquet-string``$parquet-enum``$parquet-interval``$parquet-json``$parquet-bson``$parquet-uuid`

| 控制标记 | 双 | 物理类型 | 逻辑类型 | 转换的类型 |
| --- | --- | --- | --- | --- |
| `$parquet-boolean` | 数字 | BOOLEAN | NONE | NONE |
| `$parquet-int32` | 数字 | INT32 | NONE | NONE |
| 数字 | INT64 | NONE | NONE |  |
| 数字 | FLOAT | NONE | NONE |  |
| 数字 | DOUBLE | NONE | NONE |  |
| 字符串 | BYTE\_ARRAY | NONE | UTF8 |  |
| 数字 | FIXED\_LEN\_BYTE\_ARRAY | NONE | DECIMAL |  |
| 数字 | INT64 | DECIMAL | DECIMAL |  |
| 数字 | INT32 | DATE | DATE |  |
| 数字 | INT64 | TIME | TIME\_MICROS |  |
| 数字 | INT64 | TIMESTAMP | TIMESTAMP\_MICROS |  |
| 字符串 | BYTE\_ARRAY | STRING | UTF8 |  |
| 字符串 | BYTE\_ARRAY | ENUM | ENUM |  |
| 数字 | FIXED\_LEN\_BYTE\_ARRAY | INTERVAL | INTERVAL |  |
| 字符串 | BYTE\_ARRAY | JSON | JSON |  |
| 字符串 | BYTE\_ARRAY | BSON | BSON |  |
| 字符串 | FIXED\_LEN\_BYTE\_ARRAY | UUID | NONE |  |

示例： 标记数据以存储在 Parquet 中

在本例中，使用了两个标记来定义 Parquet 的数据。该字段 num 被标记为 `$parquet-int32`，以将其定义为一个数字字段，该字段将在 Parquet 中设置为 INT32。

```

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);
```

### 将嵌套数据存储在 Parquet 文件中

通过将多个表嵌套到结构化数据中，可以将它们存储在一个 Parquet 文件中。Store 支持星形模式中的结构化节点和列表节点。也可以使用分隔符为说明符以嵌套模式存储单个表。

存储表时，请指定要包含的表，用逗号分隔。例如：`STORE Table1, Table2, Table3 INTO [lib://<file location>/<file name>.parquet] (parquet);`。您可以使用 Store 语句中的字段列表来控制存储哪些字段。例如 `STORE Field1, Field2, FROMTable1, Table2 INTO[lib://file location/file name.parquet] (parquet);`。字段列表中的所有字段必须位于一个或多个列出的表中。Store 语句中的第一个表将用作星形模式中的事实表。

字段名用于控制组的创建和嵌套方式。默认情况下，字段名称被拆分为带有句点 (`.`) 的节点。可以通过设置系统变量 FieldNameDelimiter 或使用说明符分隔符为来更改分隔符。说明符将覆盖系统变量。 有关详细信息，请参阅 [在数据加载编辑器中使用变量](https://help.qlik.com/zh-CN/sense/May2026/Subsystems/Hub/Content/Sense_Hub/Scripting/work-with-variables-in-data-load-editor.htm)。

字段名由分隔符分隔，这些部分用于创建具有嵌套组的架构。例如，`STORE Field1, Field1.Field2, Field1.Field3, Field1.Field4 FROM Table1 INTO [nested.parquet] (parquet, delimiter is '.');` 将创建两个组（Group1 和 Group2），其中具有 Fields1、Field2 和 Field3、Field4。

信息注释在架构中的节点中，组和字段的名称可能不相同。例如，`STORE Address, Address.Street INTO [nested.parquet] (parquet, delimiter is '.'');` 将失败，因为 Address 不明确，并且既是数据字段又是组。

在 Parquet 中存储嵌套数据时，表之间的键将转换为模式中的链接节点。表被转换为模式中的结构化节点。可以使用字段名称覆盖默认转换。

示例： 将嵌套数据存储在 Parquet 文件中

```

company:
LOAD * INLINE [
company, contact
AG, Amanda Honda
Cabro, Cary Frank
Fenwick, Dennis Fisher
Camros, Molly McKenzie
];

salesrep:
LOAD * INLINE [
company, salesrep
AG, Bob Park
Cabro, Cezar Sandu
Fenwick, Ken Roberts
Camros, Max Smith
];

headquarter:
LOAD * INLINE [
company, country, city
AG, 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;
```

生成的 Parquet 文件具有以下架构：

```

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)
```

#### 限制

在 Parquet 中存储嵌套数据有以下限制：

* 存储不支持映射节点。

* 存储不包括加载嵌套 parquet 文件而生成的关键字段。

* 不能将未与键字段链接的表中的数据存储在一起。

* 嵌套文件将取消数据模型的规范化。未引用的值将不会被保存，多次引用的值也将被复制。

## 限制

* Web 存储提供程序连接器 不支持 Qlik Sense Enterprise on Windows 和 Qlik Sense Desktop 中的 STORE 加载脚本语句。