# Store

Store 陳述式建立 QVD、Parquet、CSV 或 TXT 檔案。

語法：

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

該陳述式將建立明確命名的 QVD、Parquet 或文字檔案。

陳述式只能從一個資料表格匯出欄位，除非您儲存至 Parquet。如果要將數個表格中的欄位匯出至 QVD、CSV 或 TXT 檔案，則必須在指令碼中提前進行明確 join，以建立應該匯出的資料表格。您可以在 Parquet 檔案中內嵌資料，以在單一 Parquet 中儲存多個表格。

文字值會以 BOM 格式匯出到 UTF-8 中的 CSV 檔案中。可指定分隔符號，請參閱 LOAD。在 CSV 檔案中使用 store 陳述式不支援 BIFF 匯出。

資訊備註在某些資料格式不正確的情況下，將會以雙引號括起欄位，以確保正確解譯資料。例如，若欄位包含引號、逗號、空格或分行符號等字元，就可能發生此情況。

引數：

儲存命令引數

| 引數 | 描述 |
| --- | --- |
| fieldlist::= ( \* \| field) { , field } ) | 要選取的欄位清單。使用 \* 做為欄位清單表示所有欄位。<br><br>field::= fieldname [as aliasname ]<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 \| parquet)，compression is 轉碼器) | 您可以將格式規格設定為其中任一個檔案格式。若省略格式規格，會採用 qvd。<br><br><ul> <li> <p> <span>CSV</span> 和 <span>TXT</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，您也可以設定要搭配 compression is 使用哪個壓縮轉碼器。若您沒有透過 compression is 指定壓縮轉碼器，則會使用 `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、雙重、時間戳記或文字)。Qlik Sense 將內部資料儲存為鬆散輸入的雙重內容，其中來自不同來源的資料可以混合到相同的欄位中。由於 Parquet 的每個欄位中只能儲存一個雙重部分，知道每個欄位包含的內容很重要。依照預設，Qlik Sense 使用欄位類型決定應如何儲存欄位。以特定格式在 Parquet 檔案中儲存資料時，您必須指定欄位在載入時是什麼資料類型。若您嘗試以 Parquet 檔案將資料儲存到不相容的欄位中，例如在文字欄位中儲存數字或在時間戳記欄位中儲存文字，結果會是 Null 值。

載入您打算以 Parquet 儲存的資料時，可以變更預設行為。您可以格式化以變更資料類型，或標記以在 Parquet 強制特定欄類型。

### 格式化資料以儲存於 Parquet

您可以使用 Qlik Sense 格式化功能以分類資料。例如，Text()、Num()、Interval() 或 Timestamp() 可以在以 Parquet 儲存資料時強制資料格式。Qlik Sense 可以將資料儲存到將近 20 個資料類型，視欄位屬性和自動欄位標記而定。如需詳細資訊，請參閱[解譯函數](https://help.qlik.com/zh-TW/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/InterpretationFunctions/interpretation-functions.htm)。

範例： 以 Num() 和 Text() 格式化資料

下列範例展示準備資料以儲存於 Parquet。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` 標記。根據資料類型，將會儲存雙重資料的字串或數字呈現。

下列 Parquet 控制標記可用來標記欄位，以儲存於 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` | 數字 | 布林值 | 無 | 無 |
| `$parquet-int32` | 數字 | INT32 | 無 | 無 |
| 數字 | INT64 | 無 | 無 |  |
| 數字 | 浮動 | 無 | 無 |  |
| 數字 | 雙重 | 無 | 無 |  |
| 字串 | BYTE\_ARRAY | 無 | UTF8 |  |
| 數字 | FIXED\_LEN\_BYTE\_ARRAY | 無 | 小數 |  |
| 數字 | INT64 | 小數 | 小數 |  |
| 數字 | INT32 | 日期 | 日期 |  |
| 數字 | INT64 | 時間 | TIME\_MICROS |  |
| 數字 | INT64 | 時間戳記 | TIMESTAMP\_MICROS |  |
| 字串 | BYTE\_ARRAY | 字串 | UTF8 |  |
| 字串 | BYTE\_ARRAY | ENUM | ENUM |  |
| 數字 | FIXED\_LEN\_BYTE\_ARRAY | 間隔 | 間隔 |  |
| 字串 | BYTE\_ARRAY | JSON | JSON |  |
| 字串 | BYTE\_ARRAY | BSON | BSON |  |
| 字串 | FIXED\_LEN\_BYTE\_ARRAY | UUID | 無 |  |

範例： 標記資料以儲存於 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 支援結構化節點並以星狀結構描述列出節點。也可以使用 Delimiter is 說明符，以巢狀模式儲存單一表格。

儲存表格時，指定您要納入的表格並以逗號分隔。例如：`STORE Table1, Table2, Table3 INTO [lib://<file location>/<file name>.parquet] (parquet);`。您可以在 Store 陳述式使用欄位清單，以控制儲存哪些欄位。例如 `STORE Field1, Field2, FROM Table1, Table2 INTO [lib://<file location>/<file name>.parquet] (parquet);`。欄位清單中的所有欄位必須位於一個或多個列出的表格。Store 陳述式中的第一個表格將會作為星狀結構描述中的事實資料表使用。

欄位名稱用來控制如何建立和內嵌群組。依照預設，欄位名稱會以句號 (`.`) 分為節點。可以設定系統變數 FieldNameDelimiter 或使用說明符 Delimiter is，以變更分隔符號。說明符將會覆寫系統變數。如需詳細資訊，請參閱 [在資料載入編輯器中使用變數](https://help.qlik.com/zh-TW/sense/November2025/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 '.');` 將會透過 Fields1, Field2 和 Field3, Field4 建立兩個群組 (Group1 和 Group2)。

資訊備註群組和欄位在結構描述的節點中可能不會有相同的名稱。例如，`STORE Address, Address.Street INTO [nested.parquet] (parquet, delimiter is '.'');` 將會因為地址模糊且同時為資料欄位和群組而失敗。

在 Parquet 儲存巢狀資料時，表格之間的金鑰會轉換為結構描述中的連結節點。表格會轉換為結構描述中的結構化節點。您可以使用欄位名稱覆寫預設轉換。

範例： 在 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;
```

產生的 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 檔案產生的索引鍵欄位。

* 您無法從表格一同儲存未與索引鍵欄位連結的資料。

* 巢狀檔案反正規化資料模型。不會儲存非參考的值，將會複製參考多次的值。

## 限制

* Qlik Sense Enterprise on Windows 和 Qlik Sense Desktop 中的 網頁儲存空間提供者連接器 不支援 STORE 載入指令碼陳述式。