在 redshift 上使用 jdbc 下载大型数据集

Posted

技术标签:

【中文标题】在 redshift 上使用 jdbc 下载大型数据集【英文标题】:downloading large datasets using jdbc on redshift 【发布时间】:2017-11-13 22:39:30 【问题描述】:

我正在使用 Amazon Redshift JDBC 驱动程序连接到 SQL Workbench/J 上的 Redshift。

我想获得一个大型数据集查询结果(数百万行)。

WbExport 乍一看似乎有答案 (http://www.sql-workbench.net/manual/command-export.html)。

但是,它似乎想在尝试将整个结果集导出到文件之前将其加载到内存中,给我一个内存警告并中止对我的查询,甚至没有创建输出文件,所以这种方法似乎不是工作。

是否有更好的方法不涉及放弃 SQL Workbench 和 JDBC 连接?如果没有,有什么建议的可行替代方案可以最大限度地减少新工具的数量或必要的访问?

【问题讨论】:

对于庞大的数据集,我会看看数据库本身(本例为 Amazon Redshift)是否可以提供解决方案。我对 Redshift 本身并不熟悉,但我找到了一个关于卸载数据的链接,它可能很有用。 我不了解 Redshift 驱动程序,但对于 Postgres,您需要配置基于光标的检索(如链接的“内存使用和 WbExport”部分所述):sql-workbench.net/manual/dbms-problems.html#pg-problems 我可以看到问题在于它试图将整个内容加载到内存中 - 正如在任务管理器中观察工作台进程在运行时的内存使用量飙升所证明的那样。一种解决方法是加载“sqlworkbench.cmd”,它似乎将最大内存使用量分配给可用内存除以 2。我改为除以 1.2,我的查询工作了。虽然不是解决方案,只是针对这种特定情况的一种解决方法,因为我的机器上碰巧有足够的可用空间。 您是否尝试设置BlockingRowsMode 选项:docs.aws.amazon.com/redshift/latest/mgmt/… 【参考方案1】:

强烈建议您不要尝试从 Redshift 检索数百万行作为查询结果。这是非常低效的,并且会在集群运行时减慢您的集群速度。

改为使用UNLOAD 查询将数据并行提取到 S3。 UNLOAD 将快 100 倍至 1000 倍。 https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html

【讨论】:

【参考方案2】:

虽然对redshift来说不是很有效,但是如果你真的需要它,你应该可以为workbench-http://www.sql-workbench.net/manual/profiles.html设置fetchsize。

关于相同的 AWS 红移文档-https://docs.aws.amazon.com/redshift/latest/dg/queries-troubleshooting.html#set-the-JDBC-fetch-size-parameter

【讨论】:

【参考方案3】:

您可以使用最快的方法。 1.卸载数据到S3。 2.然后从S3下载数据。

【讨论】:

以上是关于在 redshift 上使用 jdbc 下载大型数据集的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中使用 JDBC 驱动程序和 Boto3 API 连接到现有的 Redshift 数据库

不使用 jdbc 驱动程序查询 Amazon Redshift

Redshift集群,如何获取片数信息

从 Redshift 卸载到 S3 时 JDBC 连接丢失。应该发生啥?

在结构化流 API (pyspark) 中使用 redshift 作为 readStream 的 JDBC 源

将结果从 Pig 直接存储到 Redshift?