EXPORT TO DELIMITED
将表、表中的列或查询结果导出到分隔文件。可以使用 DELIMITED 读回文件。某些导出器参数具有相应的解析器参数,可用于更改分隔符、空指示符和其他格式。
您可以在导出语句中使用的查询有一些限制。请参阅查询限制。
您可以以 ROS 格式导出存储在 Vertica 中的数据,也可以导出来自外部表的数据。
此语句返回写入的行数并在系统表中记录有关导出文件的信息。请参阅监控导出。
在导出到 HDFS 或 NFS 挂载点期间,Vertica 会将文件写入与目标位置相同的临时目录,并在导出完成后对该目录进行重命名。不要尝试使用临时目录中的文件。在导出到 S3、GCS 或 Azure 期间,Vertica 将文件直接写入目标路径,因此您必须等待导出完成才能读取文件。有关详细信息,请参阅导出到对象存储。
语法
EXPORT [ /*+LABEL (label-string)*/ ] TO DELIMITED ( 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
输出文件的目标目录。目录不能存在,当前用户必须有写入权限。目标可以位于以下任何文件系统上:
- HDFS 文件系统
- S3 对象存储
- Google Cloud Storage (GCS) 对象存储
- Azure Blob 存储对象存储
-
Linux 文件系统、每个节点上的 NFS 挂载或本地存储
filename
如果已指定,则所有输出都将写入由
directory
指定的位置中同名的单个文件。虽然查询可以由多个节点处理,但仅有一个节点生成输出数据。fileSizeMB
参数被忽略,查询无法在 OVER() 子句中使用分区。addHeader
- 布尔值,指定是否在每个文件的开头添加标题行。
默认值:false
delimiter
- 列分隔符。要根据 RFC 4180 生成 CSV,请将分隔符设置为
,
(逗号)。默认值:
|
(垂直条) recordTerminator
- 用于标记记录结尾的字符。
默认值:
\n
enclosedBy
- 用于将字符串和日期/时间数据括起来的字符。如果省略此参数,将不会使用字符将这些数据类型括起来。
默认值:
''
(空字符串) escapeAs
- 用于转义导出数据中必须转义的值的字符,包括
enclosedBy
值。默认值:
\\
(反斜杠) nullAs
- 用于表示数据中的 null 值的字符串。如果包含此参数,导出器会将所有 null 值导出为此值。否则,导出器会将 null 值导出为长度为零的字符串。
binaryTypesFormat
- 导出的二进制数据类型(BINARY、VARBINARY 和 LONG VARBINARY)值的格式,为以下几项之一:
-
Default
:可打印的 ASCII 字符(如果可能)和不可打印字节的已转义八进制表示。DELIMITED 解析器将读取此格式。 -
Hex
:Base 16(十六进制)表示;值前面为“0x”,且字节不会被转义。 -
Octal
:Base 8(八进制)表示,未转义。 -
Bitstring
:二进制表示,未转义。
例如,可以将值
a\000b\001c
导出为如下格式:-
默认(假设
\\
的转义字符为):a\\\000b\\\001c
-
十六进制:
0x6100620163
-
八进制:
141000142001143
-
位字符串:
0110000100000000011000100000000101100011
-
compression
- 压缩类型,为以下几项之一:
-
Uncompressed
-
BZip
-
GZip
默认值: 未压缩
-
fileExtension
- 输出文件扩展名。如果使用压缩,则会附加一个特定于压缩的扩展,例如
.bz2
。默认值:
csv
fileSizeMB
单个输出文件的最大文件大小。此值是一个提示,而不是硬限制。值为 0 表示没有任何限制。如果还指定了
filename
,则忽略fileSizeMB
。此值影响单个输出文件的大小,而不是总输出大小。对于较小的值,Vertica 将输出分成更多的文件;仍会导出所有数据。
默认值: 10GB
fileMode
仅对 HDFS 的写入,适用于所有导出文件的权限。您可以以 Unix 八进制格式指定值(例如
665
)或user-group-other
格式 — 例如,rwxr-xr-x
。即使采用八进制格式,也必须将该值的格式设置为字符串。有效的八进制值范围介于
0
和1777
(包含)之间。请参阅 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
的值如何。
特权
非超级用户:
-
源表:SELECT
-
源表架构:USAGE
-
目标目录:写入
查询限制
必须为作为表达式的选定列目标提供别名列标签。
如果对输出进行分区,则不能在 SELECT 语句中指定架构和表名。只能指定列名称。
查询只能包含一个外部 SELECT 语句。例如,您不能使用 UNION:
=> EXPORT TO DELIMITED(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 DELIMITED(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 等复合语句,请将其重写为子查询。
数据类型
此操作将原始 Flex 列导出为二进制数据。
输出
导出操作始终会创建一个输出目录,即使所有输出都写入单个文件或查询返回零行。
输出文件名遵循以下模式:
[8-character-hash]-[nodename]-[thread-id].fileExtension
.
分区目录中的列名采用小写。
由任何 Vertica 用户导出到本地文件系统的文件归 Vertica 超级用户所有。导出到 HDFS 或对象存储的文件归导出数据的 Vertica 用户所有。
具有以下要求和限制:
-
避免同时导出到相同的输出目标位置。这样做在任何文件系统上都是错误的,并且会产生不正确的结果。
-
使用共享文件位置进行输出。如果您使用本地文件系统中的目录,它必须是 NFS 挂载的目录。
-
要输出到本地文件系统,您必须有一个 USER 存储位置。
-
导出到本地文件系统时,目录权限模式为 700,文件权限模式为 600。您无法覆盖这些值。
有关特定于对象存储(S3、GCS 或 Azure)的限制,请参阅导出到对象存储。
示例
以下示例导出未压缩的逗号分隔值 (CSV),每个文件中都有一个标题行:
=> EXPORT TO DELIMITED(directory='webhdfs:///user1/data', delimiter=',', addHeader='true')
AS SELECT * FROM public.sales;