【问题标题】:loading a UCS-2LE file in Netezza在 Netezza 中加载 UCS-2LE 文件
【发布时间】:2026-01-22 02:35:01
【问题描述】:

我有多个 30GB/10 亿记录文件需要加载到 Netezza。我正在使用pyodbc 连接并运行以下命令。

create temp table tbl1(id bigint, dt varchar(12), ctype varchar(20), name varchar(100))  distribute on (id)

insert into tbl1
select * from external 'C:\projects\tmp.CSV'
using (RemoteSource 'ODBC' Delimiter '|' SkipRows 1 MaxErrors 10 QuotedValue DOUBLE)

这是来自 nzlog 文件的 sn-p

Found bad records

bad #: input row #(byte offset to last char examined) [field #, declaration] diagnostic, 
   "text consumed"[last char examined]
----------------------------------------------------------------------------------------
1: 2(0) [1, INT8] contents of field, ""[0x00<NUL>]
2: 3(0) [1, INT8] contents of field, ""[0x00<NUL>]

并且 nzbad 文件的每个字符之间都有“NUL”。

我创建了一个包含前 200 万行的新文件。然后我在上面运行iconv

iconv -f UCS-2LE -t UTF-8 tmp.CSV > tmp_utf.CSV

使用相同的命令可以完美加载新文件,没有错误。我有什么方法可以在没有iconv 转换的情况下加载文件?运行iconv 需要很长时间。

【问题讨论】:

    标签: odbc netezza iconv


    【解决方案1】:

    Netezza 不支持 UCS-2LE,我希望 UTF-8 足以满足您拥有的数据(没有古代语言或类似语言?)

    您需要通过以下方式专注于更快地进行转换:

    1. 在互联网上搜索比 iconv 更高效的 cpu 实现
    2. 一次并行转换多个文件(与您的 CPU 内核数减一相同可能是最大值)。在执行此操作之前,您可能需要拆分原始文件。不过,netezza 加载器更喜欢相对较大的文件,因此您可能希望在加载时将它们重新组合在一起,以便在该步骤中提高速度:)

    【讨论】:

    • “我希望 UTF-8 足以满足你所拥有的数据(没有古代语言之类的?)” - 记录:UTF-8可以编码任何 Unicode 字符。 UTF-8 编码/解码的一些实现存在缺陷(特别是 MySQL 的“utf8”,而不是“utf8mb4”),但这些是实现的限制,而不是编码方案本身。