在java中将大型SQL结果集直接流式传输到S3存储桶

问题描述 投票:0回答:1

在查询(Vertica)SQL 数据库时,我有一个(可能)相当大的

ResultSet
,并且因为它不适合内存,所以我试图找到一种方法将结果(以 CSV 形式)直接流式传输到S3桶。

大多数与 S3 相关的文档和问题都围绕上传文件或目录,您可以在其中将 InputStream 传递到基本 S3 SDK 或 TransferManager,但这些不适用。

似乎在所有情况下,S3 SDK 都需要事先知道内容长度,但这对于查询结果显然是不可能的。

https://github.com/alexmojaki/s3-stream-upload,但它使用了即将(2025)弃用的 sdk v1,因此这似乎不是一个可行的长期选择要么。

我唯一的选择是手动创建 5MB 批次并使用更底层的 SDK 进行分段上传吗?或者还有其他选择吗?

java sql vertica aws-java-sdk aws-java-sdk-2.x
1个回答
0
投票

使用

EXPORT TO DELIMITED()
,使用vsql,不需要任何java代码。

-- creating a test table ...
CREATE TABLE indata(uid,cid,att1) AS
          SELECT 16,78940,'yel,k'
UNION ALL SELECT 17,78940,'master#$;@'
UNION ALL SELECT 15,78940,'"hello , how are you"'
UNION ALL SELECT NULL,NULL,NULL
;

这是导出命令:

EXPORT TO DELIMITED(
  directory='s3://tmp/export'
, filename='indata'
, addHeader='true'
, delimiter=','
, enclosedBy='"'
, escapeAs ='"'
) OVER(PARTITION BY uid) AS
SELECT * FROM indata;

s3://tmp/export/
将包含这些目录、文件和数据(导出到 POSIX 文件系统,因为我当前无法访问 S3):

[dbadmin@mgessner01 export]$ find /tmp/export -name "*.csv" -exec head -v {} \; 
==> /tmp/export/uid=/d90efa00-v_sbx_node0001-140006419035904-0.csv <==
uid,cid,att1
,,""
==> /tmp/export/uid=17/d90efa00-v_sbx_node0001-140006419035904-0.csv <==
uid,cid,att1
17,78940,"master#$;@"
==> /tmp/export/uid=15/2dca6b78-v_sbx_node0003-140230643066624-0.csv <==
uid,cid,att1
15,78940,"""hello ", how are you"""
==> /tmp/export/uid=16/2dca6b78-v_sbx_node0003-140230643066624-0.csv <==
uid,cid,att1
16,78940,"yel",k"
© www.soinside.com 2019 - 2024. All rights reserved.