Netezza 流式处理结果集

Posted

技术标签:

【中文标题】Netezza 流式处理结果集【英文标题】:Netezza Streaming ResultSet 【发布时间】:2016-02-23 18:40:48 【问题描述】:

我遇到了内存问题,因为我试图从 Netezza 数据库中读取一个巨大的 ResultSet。 Netezza 是否像 mysql 那样支持任何类型的“流式传输”结果集?如果没有,是否会像这样限制获取大小?:

stmt.setFetchSize(50); 
conn.setAutoCommitMode(false);

【问题讨论】:

您打算在收到数据后如何处理? 【参考方案1】:

如果您想提取行以存储在文件中,那么最好的办法是使用远程外部表。

这是一个通过 JDBC 创建临时远程外部表的示例。这将调用 JDBC 驱动程序提供的批量导出/加载功能,并创建一个管道分隔的文本文件。

create external table 'c:\mytest.txt' 
USING (DELIMITER '|' REMOTESOURCE 'JDBC' ) as
select *
from table1;

您可以使用 conn.createStatement().execute 调用它,并且您可能必须将文件规范更改为 c:\mytest.txt 以转义现有的反斜杠。

您可以在documentation here 中阅读有关外部表的更多信息。

顺便说一句,您可以使用 setFetchSize。不过,我不确定它是否能解决您的内存问题。

【讨论】:

除了如上所述导出到文件之外,Netezza 没有像 MySQL 那样提供任何“流式”结果集选项,对吗?【参考方案2】:

从以下 URL,您可以获取有关 ROWSET_LIMIT 的信息,使用此变量设置,您可以将查询结果限制为您的要求并根据需要创建流 - https://www-01.ibm.com/support/knowledgecenter/SSULQD_7.1.0/com.ibm.nz.adm.doc/c_sysadm_user_rowset_limits.html?lang=en

“您可以限制查询可以返回的行数,从而限制大型结果集的资源。在创建用户或组时指定行集限制会自动限制返回的行,以便用户执行不必在他们的 SQL 查询中附加限制子句。”

【讨论】:

恐怕这不是我真正想要的。我不想对结果设置限制并手动创建流。正在寻找使用批量提取大小或类似方法的更自然的解决方案。

以上是关于Netezza 流式处理结果集的主要内容,如果未能解决你的问题,请参考以下文章

流式计算概述

「Flink」理解流式处理重要概念

流式处理框架对比

如何使用 Asyncio 在 3 个子进程(使用管道)之间流式处理数据并使用结果数据

Streaming 101:批处理之外的流式世界第一部分

Streaming 101:批处理之外的流式世界第一部分