跳到主要内容 跳到补充内容

Store

Store 语句创建 QVDParquetCSVTXT 文件。

语法:  

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

该语句将创建一个明确命名的 QVDParquet 或文本文件。

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

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

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

您可指定将自己的文件存储在个人空间还是有写入权限的共享空间。如果存储在共享空间,成员可使用该数据以在空间中创建应用程序。参阅:管理共享空间中的权限

参数:  

存储命令参数
参数 说明
fieldlist::= ( * | field) { , field } )

要选择的字段列表。使用 * 作为字段列表,则其表示全部字段。 

field::= fieldname [as aliasname ]

fieldname是指与table中的字段名完全相同的文本。(请注意,如果字段名包含空格或其他非标准字符,则必须使用双引号或方括号括起来。)

aliasname 是指生成的 QVDCSV 文件中所用字段的替代名称。

table 脚本标签表示要用作数据源的已加载表格。
filename

目标文件的名称,包括现有文件夹数据连接的有效路径。

示例:  

  • 个人空间: [lib://DataFiles/xyz.qvd]

    文件名中可以使用 '/' 分隔的路径层次结构。但是,数据加载编辑器和数据管理器 UI 当前不支持以分层方式显示路径。如果使用“/”分隔的文件名,它将完整地显示在文件名列中。

  • 共享的空间: [lib://TeamSharedSpace:DataFiles/xyz.qvd]
format-spec ::=( ( txt | qvd | parquet),压缩为编码解码器)

您可以将格式规范设置为这些文件格式之一。如果省略格式规范,则假定为 qvd

  • CSVTXT 文件的 txt

  • qvd 用于 QVD 文件。

  • parquet 用于 Parquet 文件。

如果使用 parquet,还可以设置用于压缩为的压缩编解码器。如果不是用压缩为指定压缩编解码器,则使用 snappy。有以下压缩设置可用:

  • uncompressed

  • snappy

  • gzip

  • lz4

  • brotli

  • zstd

  • lz4_hadoop

示例:

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

信息注释DataFiles 连接的文件扩展要区分大小写。例如:.qvd

示例:  

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];

存储在 Parquet 文件中

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

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

格式化数据以存储在 Parquet 中

您可以使用 Qlik Sense 格式化功能对数据进行分类。例如, Text()Num()Interval()Timestamp() 可以在 Parquet 中存储数据时强制执行数据格式。Qlik Sense 可以根据字段属性和自动字段标签将数据存储为近 20 种数据类型。有关更多信息,请参阅解释函数

示例: 使用 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://DataFiles/Tmp.parquet] (parquet);

标记数据以存储在 Parquet 中

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

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

Parquet 控制标记
控制标记物理类型逻辑类型转换的类型
$parquet-boolean数字BOOLEANNONENONE
$parquet-int32数字INT32NONENONE
$parquet-int64数字INT64NONENONE
$parquet-float数字FLOATNONENONE
$parquet-double数字DOUBLENONENONE
$parquet-bytearray字符串BYTE_ARRAYNONEUTF8
$parquet-bytearrayfix数字FIXED_LEN_BYTE_ARRAYNONEDECIMAL
$parquet-decimal数字INT64DECIMALDECIMAL
$parquet-date数字INT32DATEDATE
$parquet-time数字INT64TIMETIME_MICROS
$parquet-timestamp数字INT64TIMESTAMPTIMESTAMP_MICROS
$parquet-string字符串BYTE_ARRAYSTRINGUTF8
$parquet-enum字符串BYTE_ARRAYENUMENUM
$parquet-interval数字FIXED_LEN_BYTE_ARRAYINTERVALINTERVAL
$parquet-json字符串BYTE_ARRAYJSONJSON
$parquet-bson字符串BYTE_ARRAYBSONBSON
$parquet-uuid字符串FIXED_LEN_BYTE_ARRAYUUIDNONE

示例: 标记数据以存储在 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 Data INTO [lib://DataFiles/Tmp.parquet] (parquet);

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

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

存储表时,请指定要包含的表,用逗号分隔。例如: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 或使用说明符分隔符为来更改分隔符。说明符将覆盖系统变量。有关更多信息,请参阅在数据加载编辑器中使用变量

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

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

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://DataFiles/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 文件而生成的关键字段。

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

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

本页面有帮助吗?

如果您发现此页面或其内容有任何问题 – 打字错误、遗漏步骤或技术错误 – 请告诉我们如何改进!