语法

使用 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 导出程序还支持任意组合的 ARRAYROW 类型:

=> 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 PARQUETEXPORT TO ORCEXPORT TO JSONEXPORT TO DELIMITED