语法
注意
EXPORT TO PARQUET、EXPORT TO ORC、EXPORT TO JSON 和 EXPORT TO DELIMITED 具有相同的通用语法。本文档将它们统称为 EXPORT 语句,以免与 导出到 VERTICA 混淆。使用 EXPORT 语句可导出由 SELECT 语句指定的数据,如以下示例所示:
=> EXPORT TO PARQUET(directory='webhdfs:///data/sales_data')
AS SELECT * FROM public.sales;
Rows Exported
---------------
14336
(1 row)
directory 实参会指定写入文件的位置且为必需实参。您必须具有写入输出目录的权限。该目录不得已存在。您可以导出到 HDFS、S3、GCS、Azure 或 Linux 文件系统。有关特定于对象存储的其他注意事项,请参阅导出到对象存储。如果导出到本地 Linux 文件系统(不是共享的 NFS 挂载),则必须执行一些额外步骤;请参阅导出到 Linux 文件系统。
注意
只能对每个输出目录执行一次导出。如果对同一目录执行多次并发导出,则只有一次导出会成功。可以使用 EXPORT 语句在 Vertica 中的多个表之间写入查询并导出结果。通过这种方法,可以利用 Vertica 中强大、快速的查询执行,同时将结果提供给其他客户端:
=> EXPORT TO ORC(directory='webhdfs:///data/sales_by_region')
AS SELECT sale.price, sale.date, store.region
FROM public.sales sale
JOIN public.vendor store ON sale.distribID = store.ID;
Rows Exported
---------------
23301
(1 row)
数据类型
所有导出程序都可以导出标量类型和基元数组。JSON 导出程序还支持任意组合的 ARRAY 和 ROW 类型:
=> SELECT * FROM restaurants;
name | cuisine | location_city | menu
-------------------+---------+----------------------------+------------------------------------------------------------------------------
Bob's pizzeria | Italian | ["Cambridge","Pittsburgh"] | [{"item":"cheese pizza","price":null},{"item":"spinach pizza","price":10.5}]
Bakersfield Tacos | Mexican | ["Pittsburgh"] | [{"item":"veggie taco","price":9.95},{"item":"steak taco","price":10.95}]
(2 rows)
=> EXPORT TO JSON (directory='/output/json') AS SELECT * FROM restaurants;
Rows Exported
---------------
2
(1 row)
=> \! cat /output/json/*.json
{"name":"Bob's pizzeria","cuisine":"Italian","location_city":["Cambridge","Pittsburgh"],"menu":[{"item":"cheese pizza","price":null},{"item":"spinach pizza","price":10.5}]}
{"name":"Bakersfield Tacos","cuisine":"Mexican","location_city":["Pittsburgh"],"menu":[{"item":"veggie taco","price":9.95},{"item":"steak taco","price":10.95}]}
查询
EXPORT 语句会重写您指定的查询,因为导出是由用户定义的转换函数 (UDTF) 完成的。由于进行了该重写,系统对您提供的查询会有一些限制。
查询只能包含一个外部 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 等复合语句,请将其重写为子查询。
导出数据时,可以使用 OVER() 子句对数据进行分区和排序,如对数据进行分区和排序中所述。分区和排序可以提高查询性能。如果对数据进行分区,则不能在 SELECT 语句中指定架构名称和表名称。在这种情况下,请仅指定列名称。
所有导出程序都有一个必需的 directory
参数。所有导出程序都允许您指定压缩类型,并且每个导出程序都有特定于格式的参数。请参阅各个参考页面上的参数描述:EXPORT TO PARQUET、EXPORT TO ORC、EXPORT TO JSON 和 EXPORT TO DELIMITED。