将特定查询数据从 netezza 数据库导出到 CSV 文件

Posted

技术标签:

【中文标题】将特定查询数据从 netezza 数据库导出到 CSV 文件【英文标题】:Export specific query data to CSV file from netezza database 【发布时间】:2018-03-12 17:01:50 【问题描述】:

我想将数据从 netezza 数据库 导出到 CSV 文件。

数据格式为:

col1,col2,col3

或者:

"col1","col2","col3"

我正在使用查询:

CREATE EXTERNAL TABLE 'H:\\test.csv' USING ( DELIMITER ',' REMOTESOURCE 'ODBC' ) AS
SELECT * FROM TEST_TABLE

col3 具有包含逗号的字段时,上述查询不起作用,因为它表示使用转义字符将其导出为 '\'。

示例表:

A | B | C
a | b | Germany, NA

我也试过了,但我在 csv 中得到了输出:

a,b,Germany\, NA

或者通过在每一列中添加引号我得到输出:

"a","b","Germany\, NA"  

在这里,我在字段中得到了额外的“\”字符。 我正在寻找使用 nzsql 或外部表查询方法或仅编写自己的脚本方法来解决它的解决方案。

在不改变字段数据的情况下我的预期输出:

"a","b","德国,北美"

【问题讨论】:

【参考方案1】:

可以通过使用 nzsql 命令行语句来实现所需的输出。这种方法的唯一限制是最大文件将限制为 2 GB。这是来自 IBM KB Sending query results to an output file的链接

[nz@netezza ~]$ nzsql -d test -A -t -c  "select quote_ident(col1),quote_ident(col2), quote_ident(col3) from test" -o '/nzscratch/test.csv'

输出:

[nz@netezza ~]$ cat /nzscratch/test.csv
"A"|"B"|"C"
a|b|"Germany, NA"

【讨论】:

如果文件大小超过 2GB 有办法吗? 您可以使用外部表格导出表格,其分隔符不是“,”,一旦导出完成,将分隔符替换为原始分隔符。【参考方案2】:

您可以使用 ESCAPECHAR '@' 来使用“@”而不是反斜杠,只有反斜杠作为 escape character。问题是 csv 文件需要一种方式来表示“这个逗号是数据,而不是分隔符”——这就是转义字符的用途。使用 csv 文件的代码应配置为使用相同的转义字符。

这是您在使用 csv 等定义松散的数据格式时遇到的怪癖之一。只要您定义生产者和消费者都期望的定界符和转义字符 - 并且您使用相同的字符编码 - 你会没事的。

这不会更改您的数据,只是使交换格式更加具体。如果您提供有关使用数据的内容的一些详细信息,我可以更新此答案以提供有关通知消费者反斜杠用作转义字符的详细信息。

-- 编辑-- 显然,netezza 的一些实现只支持反斜杠作为分隔符。

IBM 参考资料:

QuotedValue EscapeChar Delimiter

【讨论】:

实际上,我并不期待 '@' 或任何其他字符,因为这会改变我的数据。我希望输出为 "a","b","Germany, NA" 它不会更改您的数据,它会将其编码为逗号分隔值文件。如果没有转义字符,消费者将不知道逗号是分隔字段还是字段中的部分数据 是的,我同意当我们通知消费者反斜杠用作转义字符时它起作用。但我正在寻找在不通知转义字符的情况下实现它的方法。我为每个字段添加双引号,然后它不应该转义 ',' 字符。无论如何,我可以在没有逃逸字符的情况下获得解决方案吗? 我看到您尝试了RequireQuotes 选项,但它仍然发出了转义字符。我不确定你还能尝试什么!道歉

以上是关于将特定查询数据从 netezza 数据库导出到 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 nzsql 将数据导出到 CSV

win 7 将 IBM netezza 数据库中的 sql 数据表导出到 txt 文件的错误

netezza nzsql 将查询结果导出到 csv 文件

我可以从 Netezza 导出 SQL 查询结果吗?

将 Python3 中的数据帧写入 Netezza

是否有针对 Netezza(Toad 数据点)的查询以查找存在特定字段名称的所有表