EXPORT TO PARQUET

将表、表中的列或查询结果以 Parquet 格式导出到文件。

可以在导出前使用 OVER() 子句对数据进行分区。除了导出列数据之外,还可以对数据进行分区。对数据进行分区可启用分区修剪,从而提高查询性能。请参阅分区文件路径

您可以在导出语句中使用的查询有一些限制。请参阅查询限制

您可以以 ROS 格式导出存储在 Vertica 中的数据,也可以导出来自外部表的数据。

此语句返回写入的行数并在系统表中记录有关导出文件的信息。请参阅监控导出

在导出到 HDFS 或 NFS 挂载点期间,Vertica 会将文件写入与目标位置相同的临时目录,并在导出完成后对该目录进行重命名。不要尝试使用临时目录中的文件。在导出到 S3、GCS 或 Azure 期间,Vertica 将文件直接写入目标路径,因此您必须等待导出完成才能读取文件。有关详细信息,请参阅导出到对象存储

导出数据后,您可以使用 GET_METADATA 函数检查结果。

语法


EXPORT [ /*+LABEL (label-string)*/ ] TO PARQUET ( directory=path[, param=value [,...] ] )
   [ OVER (over-clause ) ] AS SELECT query-expression

参数

LABEL
将标签分配到语句,以便您可以在分析和调试时识别它。
over-clause
指定如何使用 PARTITION BY 对表数据进行分区。在分区内,您可以使用 ORDER BY 进行排序。请参阅SQL 分析。该子句可能包含列引用,但不包含表达式。

如果您对数据进行分区,Vertica 会创建一个分区目录结构,将列名称转换为小写。有关目录结构的描述,请参阅分区文件路径。如果您使用 fileName 参数,则无法使用分区。

如果省略此子句,Vertica 会优化最大并行度。

query-expression
指定要导出的数据。有关重要限制,请参阅查询限制

参数

directory

输出文件的目标目录。目录不能存在,当前用户必须有写入权限。目标可以位于以下任何文件系统上:

filename

如果已指定,则所有输出都将写入由 directory 指定的位置中同名的单个文件。虽然查询可以由多个节点处理,但仅有一个节点生成输出数据。fileSizeMB 参数被忽略,查询无法在 OVER() 子句中使用分区。

compression
列压缩类型,为以下几项之一:
  • Snappy

  • GZIP

  • Brotli

  • ZSTD

  • Uncompressed

默认值: Snappy

rowGroupSizeMB
导出的行组的未压缩大小 (MB),为 1 至 fileSizeMB(包含)之间的整数值,如果 fileSizeMB 为 0,则为无限制。

导出文件中的行组小于此值,因为 Parquet 文件在写入时被压缩。为了在导出到 HDFS 时获得最佳性能,请将 size 设置为小于 HDFS 块大小。

行组大小会影响导出时的内存消耗。导出线程至少使用两倍的行组大小。默认值 512MB 是在写入更大行组和允许其他 Vertica 操作有足够可用内存之间进行折衷。如果您在数据库负载不重时执行导出,则可以通过增加导出的行组大小来提高导出数据的读取性能。但是,跨 HDFS 上的多个块的行组会因需要更多 I/O 而降低读取性能,因此请不要将行组大小设置为大于 HDFS 块大小。

默认值: 512

fileSizeMB

单个输出文件的最大文件大小。此值是一个提示,而不是硬限制。值为 0 表示没有任何限制。如果还指定了 filename,则忽略 fileSizeMB

此值影响单个输出文件的大小,而不是总输出大小。对于较小的值,Vertica 将输出分成更多的文件;仍会导出所有数据。

默认值: 10GB

fileMode

仅对 HDFS 的写入,适用于所有导出文件的权限。您可以以 Unix 八进制格式指定值(例如 665)或 user-group-other格式 — 例如,rwxr-xr-x。即使采用八进制格式,也必须将该值的格式设置为字符串。

有效的八进制值范围介于 01777(包含)之间。请参阅 Apache Hadoop 文档中的 HDFS 权限

将文件写入 HDFS 以外的任何目标位置时,此参数无效。

默认值: 660,无论 hdfs-site.xml 中的 fs.permissions.umask-mode 的值为何值。

dirMode

仅对 HDFS 的写入,适用于所有导出目录的权限。这些值遵循与 fileMode 相同的规则。此外,您必须授予 Vertica HDFS 用户完全权限,至少为 rwx------700

将文件写入 HDFS 以外的任何目标位置时,此参数无效。

默认值: 755,无论 hdfs-site.xml 中的 fs.permissions.umask-mode 的值如何。

int96AsTimestamp
布尔值,指定将时间戳导出为 int96 物理类型 (true) 还是 int64 物理类型 (false)。

默认值:true

特权

非超级用户:

  • 源表:SELECT

  • 源表架构:USAGE

  • 目标目录:写入

查询限制

必须为作为表达式的选定列目标提供别名列标签。

如果对输出进行分区,则不能在 SELECT 语句中指定架构和表名。只能指定列名称。

查询只能包含一个外部 SELECT 语句。例如,您不能使用 UNION:

=> EXPORT TO PARQUET(directory = '/mnt/shared_nfs/accounts/rm')
   OVER(PARTITION BY hash)
   AS
   SELECT 1 as account_id, '{}' as json, 0 hash
   UNION ALL
   SELECT 2 as account_id, '{}' as json, 1 hash;
ERROR 8975:  Only a single outer SELECT statement is supported
HINT:  Please use a subquery for multiple outer SELECT statements

而需要重写查询以使用子查询:

=> EXPORT TO PARQUET(directory = '/mnt/shared_nfs/accounts/rm')
   OVER(PARTITION BY hash)
   AS
   SELECT
    account_id,
    json
   FROM
   (
     SELECT 1 as account_id, '{}' as json, 0 hash
     UNION ALL
     SELECT 2 as account_id, '{}' as json, 1 hash
   ) a;
 Rows Exported
---------------
             2
(1 row)

要使用 UNION、INTERSECT 和 EXCEPT 等复合语句,请将其重写为子查询。

数据类型

EXPORT TO PARQUET 将 Vertica 数据类型转换为 Hive 数据类型,如下表所示。

小数精度必须为 <= 38。

导出的 Hive 类型可能与 Vertica 类型不同。例如,Vertica INT 导出为 Hive BIGINT。在定义 Hive 外部表以读取导出的数据时,可能必须要调整列定义。

此操作将原始 Flex 列导出为二进制数据。

输出

导出操作始终会创建一个输出目录,即使所有输出都写入单个文件或查询返回零行。

输出文件名遵循以下模式: [8-character-hash]-[nodename]-[thread-id].parquet.

分区目录中的列名采用小写。

由任何 Vertica 用户导出到本地文件系统的文件归 Vertica 超级用户所有。导出到 HDFS 或对象存储的文件归导出数据的 Vertica 用户所有。

具有以下要求和限制:

  • 避免同时导出到相同的输出目标位置。这样做在任何文件系统上都是错误的,并且会产生不正确的结果。

  • 使用共享文件位置进行输出。如果您使用本地文件系统中的目录,它必须是 NFS 挂载的目录。

  • 要输出到本地文件系统,您必须有一个 USER 存储位置。

  • 导出到本地文件系统时,目录权限模式为 700,文件权限模式为 600。您无法覆盖这些值。

有关特定于对象存储(S3、GCS 或 Azure)的限制,请参阅导出到对象存储

示例

以下示例演示了如何使用 GZIP 压缩从公共架构的 T1 表中导出所有列。

=> EXPORT TO PARQUET(directory='webhdfs:///user1/data', compression='gzip')
  AS SELECT * FROM public.T1;

以下示例演示了如何使用多个表导出查询结果。

=> EXPORT TO PARQUET(directory='s3://DataLake/sales_by_region')
   AS SELECT sale.price, sale.date, store.region
   FROM public.sales sale
   JOIN public.vendor store ON sale.distribID = store.ID;

以下示例演示了数据的分区和导出操作。EXPORT TO PARQUET 首先对区域上的数据进行分区,然后在每个分区内按存储进行排序。

=> EXPORT TO PARQUET(directory='gs://DataLake/user2/data')
  OVER(PARTITION BY store.region ORDER BY store.ID)
  AS SELECT sale.price, sale.date, store.ID
  FROM public.sales sale
  JOIN public.vendor store ON sale.distribID = store.ID;

以下示例对作为表达式的选定列目标使用了别名列标签。

=> EXPORT TO PARQUET(directory='webhdfs:///user3/data')
  OVER(ORDER BY col1) AS SELECT col1 + col1 AS A, col2
  FROM public.T3;

以下示例为输出设置了权限。

=> EXPORT TO PARQUET(directory='webhdfs:///user1/data',
     fileMode='432', dirMode='rwxrw-r-x')
  AS SELECT * FROM public.T1;