在 Netezza 中加载 UCS-2LE 文件

Posted

技术标签:

【中文标题】在 Netezza 中加载 UCS-2LE 文件【英文标题】:loading a UCS-2LE file in Netezza 【发布时间】:2020-03-15 00:17:42 【问题描述】:

我有多个 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 需要很长时间。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

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

以上是关于在 Netezza 中加载 UCS-2LE 文件的主要内容,如果未能解决你的问题,请参考以下文章

Netezza CSV 加载忽略值内的逗号

Windows API:ANSI 和宽字符字符串——是 UTF8 还是 ASCII? UTF-16 还是 UCS-2 LE?

如何在 OpenGL 中加载和渲染可能包含三角形、四边形或 N-Gons 的 OBJ 文件?

sqlldr : 在单列中加载 csv 文件的多列

如何使用 PySpark 从日常文件中加载滚动窗口?

无法在新的 appDomain 中加载程序集