在 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 文件的主要内容,如果未能解决你的问题,请参考以下文章
Windows API:ANSI 和宽字符字符串——是 UTF8 还是 ASCII? UTF-16 还是 UCS-2 LE?