Main Content

parquetwrite

将列数据写入 Parquet 文件

说明

示例

parquetwrite(filename,T) 将表或时间表 T 写入具有 filename 所指定文件名的 Parquet 2.0 文件。

示例

parquetwrite(filename,T,Name,Value) 使用一个或多个名称-值对组参量指定其他选项。例如,您可以指定 "VariableCompression" 来更改所使用的压缩算法,或指定 "Version" 来将数据写入 Parquet 1.0 文件。

示例

全部折叠

将表格数据写入 Parquet 文件中,并比较同样的表格数据采用 .csv.parquet 文件格式时的大小。

将文件 outages.csv 中的表格数据读入表中。

T = readtable('outages.csv');

将数据写入 Parquet 文件格式。默认情况下,parquetwrite 函数使用 Snappy 压缩方案。要指定其他压缩方案,请参阅 'VariableCompression' 名称-值对组。

parquetwrite('outagesDefault.parquet',T)

获取文件大小,并计算同样的表格数据采用 .csv 格式和 .parquet 格式时的大小之比。

获取 .csv 文件的大小。

fcsv = dir(which('outages.csv'));
size_csv = fcsv.bytes
size_csv = 101040

获取 .parquet 文件的大小。

fparquet  = dir('outagesDefault.parquet');
size_parquet = fparquet.bytes
size_parquet = 44881

计算比率。

sizeRatio = ( size_parquet/size_csv )*100 ;
disp(['Size Ratio = ', num2str(sizeRatio) '% of original size'])
Size Ratio = 44.419% of original size

创建嵌套数据并将其写入 Parquet 文件。

创建一个包含一个嵌套数据层的表。

FirstName = ["Akane"; "Omar"; "Maria"];
LastName = ["Saito"; "Ali"; "Silva"];
Names = table(FirstName,LastName);
NumCourse = [5; 3; 6];
Courses = {["Calculus I"; "U.S. History"; "English Literature"; "Studio Art"; "Organic Chemistry II"];
            ["U.S. History"; "Art History"; "Philosphy"];
            ["Calculus II"; "Philosphy II"; "Ballet"; "Music Theory"; "Organic Chemistry I"; "English Literature"]};
data = table(Names,NumCourse,Courses)
data=3×3 table
            Names            NumCourse      Courses   
    _____________________    _________    ____________

    FirstName    LastName                             
    _________    ________                             
                                                      
     "Akane"     "Saito"         5        {5x1 string}
     "Omar"      "Ali"           3        {3x1 string}
     "Maria"     "Silva"         6        {6x1 string}

将嵌套数据写入 Parquet 文件。

parquetwrite("StudentCourseLoads.parq",data)

读取该嵌套的 Parquet 数据。

t2 = parquetread("StudentCourseLoads.parq")
t2=3×3 table
            Names            NumCourse      Courses   
    _____________________    _________    ____________

    FirstName    LastName                             
    _________    ________                             
                                                      
     "Akane"     "Saito"         5        {5x1 string}
     "Omar"      "Ali"           3        {3x1 string}
     "Maria"     "Silva"         6        {6x1 string}

输入参数

全部折叠

输出 Parquet 文件的名称,指定为字符向量或字符串标量。

根据您写入的位置,filename 可以采用以下形式之一。

位置

形式

当前文件夹

要写入当前文件夹,请在 filename 中指定文件名。

示例:'myData.parquet'

其他文件夹

要写入不同于当前文件夹的文件夹,请在 filename 中指定完整或相对路径名称。

示例:'C:\myFolder\myData.parquet'

示例:'dataDir\myData.parquet'

远程位置

要写入远程位置,filename 必须包含指定为统一资源定位器 (URL) 形式的文件的完整路径:

scheme_name://path_to_file/myData.parquet

根据远程位置,scheme_name 可以是下表中的值之一。

远程位置scheme_name
Amazon S3™s3
Windows Azure® Blob 存储wasb, wasbs
HDFS™hdfs

有关详细信息,请参阅处理远程数据

示例:'s3://bucketname/path_to_file/myData.parquet'

数据类型: char | string

输入数据,指定为表或时间表。

使用 parquetwrite 导出结构化 Parquet 数据。有关支持写入的 Parquet 数据类型的详细信息,请参阅 Apache Parquet Data Type Mappings

名称-值参数

将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: parquetwrite(filename,T,'VariableCompression','gzip','Version','1.0')

压缩方案名称,指定为下列值之一:

  • 'snappy''brotli''gzip''uncompressed'。如果您指定一种压缩算法,则 parquetwrite 使用相同的算法压缩所有变量。

  • 您也可以指定字符向量元胞数组或字符串向量,其中包含用于每个变量的压缩算法的名称。

通常,'snappy' 的读写性能更好,'gzip' 压缩率更高,但 CPU 处理时间更长;'brotli' 通常压缩速度慢,但生成的文件大小最小。

示例: parquetwrite('myData.parquet', T, 'VariableCompression', 'brotli')

示例: parquetwrite('myData.parquet', T, 'VariableCompression', {'brotli' 'snappy' 'gzip'})

编码方案名称,指定为下列值之一:

  • 'auto' - parquetwrite 对逻辑变量使用 'plain' 编码,对所有其他变量使用 'dictionary' 编码。

  • 'dictionary''plain' - 如果您指定一种编码方案,则 parquetwrite 会用该方案对所有变量进行编码。

  • 您也可以指定字符向量元胞数组或字符串向量,其中包含用于每个变量的编码方案的名称。

一般情况下,使用 'dictionary' 编码后文件较小,但对于不包含许多重复值的变量,'plain' 编码更快。如果字典的大小或唯一值的数量变得太大,则编码会自动还原为普通编码。有关 Parquet 编码的详细信息,请参阅 Parquet encoding definitions

示例: parquetwrite('myData.parquet', T, 'VariableEncoding', 'plain')

示例: parquetwrite('myData.parquet', T, 'VariableEncoding', {'plain' 'dictionary' 'plain'})

每个输出行组要写入的行数,指定为非负数值标量或非负整数向量。

  • 如果指定标量,标量值将设置输出 Parquet 文件中所有行组的高度。如果该标量值不是行组数量的确切倍数,则最后一个行组包含的行可能会比较少。

  • 如果指定向量,则向量中的每个值将设置输出 Parquet 文件中一个对应行组的高度。向量中所有值的总和必须与输入表的高度匹配。

行组是可以一次性读入内存的 Parquet 文件的最小子集。降低行组高度有助于在读取时将数据放入内存。行组高度还会影响对 Parquet 数据集执行过滤操作的性能,因为在读取时,较大的行组高度可用于过滤更多的数据。

如果未指定 RowGroupHeights 并且输入表超过 67108864 行,则输出文件中的行组数等于 floor(TotalNumberOfRows/67108864)+1

示例: RowGroupHeights=100

示例: RowGroupHeights=[300, 400, 500, 0, 268]

要使用的 Parquet 版本,指定为 '1.0''2.0'。默认情况下,'2.0' 提供最高效的存储,但您可以选择 '1.0' 以获得与支持 Parquet 格式的外部应用程序的最广泛兼容性。

小心

Parquet 版本 1.0 有一项限制,即它无法对 uint32 类型的变量进行来回处理(这些变量以 int64 形式读回到 MATLAB® 中)。

局限性

在某些情况下,parquetwrite 创建的文件并不能准确表示原始数组 T。如果使用 parquetreaddatastore 来读取文件,则结果可能与原始表的格式或内容不完全相同。有关详细信息,请参阅Apache Parquet Data Type Mappings

扩展功能

版本历史记录

在 R2019a 中推出

全部展开