来自平面文件的 GPFdist 插入会在插入时引发错误“用于编码“UTF8”的字节序列无效:0x00”
Posted
技术标签:
【中文标题】来自平面文件的 GPFdist 插入会在插入时引发错误“用于编码“UTF8”的字节序列无效:0x00”【英文标题】:GPFdist insert from flat file throws error 'invalid byte sequence for encoding "UTF8": 0x00' on insert 【发布时间】:2017-08-24 16:01:02 【问题描述】:我在写入以从大型平面文件中提取数据的过程中遇到问题。我正在使用具有 UTF8 规范的 python 包装器预处理平面文件,如下所示:
wrFile = io.open("outFile","w+",encoding='utf8')
我正在使用以下命令逐行读取源文件:
lineACT = linecache.getline("inFile", i+j)
lineNxt = linecache.getline("inFile", i+j+1)
进一步,在预处理这些行之后,我正在编写如下文件:
wrFile.write(lineACT)
因此,遍历 infile 中的行数,我正在创建 outfile。
现在可以使用以下查询将文件提取到外部postgresql
表中。加载器应用程序是用Java
编写的,所有配置都使用属性文件传递:
-- CREATE EXTERNAL TABLE FOR A SPECIFIC CLIENT
CREATE EXTERNAL TABLE outTable ( col1 character(3), col2
character(3),..... )
LOCATION ( '<LocationOf outFile>' )
FORMAT 'CUSTOM' (formatter=fixedwidth_in,col1='3',col2='3'......)
LOG ERRORS INTO errorTable SEGMENT REJECT LIMIT 2 ROWS;
-- INSERT INTO DELTA TABLE
INSERT INTO deltaTable
SELECT col1, col2,......
FROM outTable
;
-- DROP EXTERNAL TABLE
DROP EXTERNAL TABLE IF EXISTS outTable;
在 UNIX
盒子上运行它会引发异常:
Cause: org.postgresql.util.PSQLException: ERROR: Segment reject limit reached. Aborting operation. Last error was: Expected line size from the formatting string: 1655, but the actual size is: 455 (seg43 slice1 uxpbdpsdw06.dstcorp.net:1028 pid=335160)
注意: outFile 中的每一行是 1655 个字符。 outTable 和 deltaTable 的列结构也是 1655。
当我检查 errorTable 时,我在 errmsg
列中找到了这个:
invalid byte sequence for encoding "UTF8": 0x00
现在,我猜测数据库不接受文件中的null
字符'0x00'
,因为我检查的数据库的编码属性是'UTF8'
我尝试使用以下 bash 命令从文件中删除空字符:
sed 's/\x0/-9/g' outFile > outFile_
&
tr < outFile -d '\000' > outFile_
但到目前为止还没有任何效果。有人可以就如何使这项工作提出一些建议吗?
--
提前致谢!
【问题讨论】:
您确认“outFile_”实际上已经删除了空字节吗?您是否也将“outFile”替换为“outFIle_”,或者更改表以从“outFile_”加载数据? 如果您在 Python 中进行预处理,那么为什么不去除空字节呢?line.replace("\0","")
或其他,假设它们在其他方面毫无意义。
【参考方案1】:
大多数情况下,只要数据具有不可打印的字符,就会遇到此特定错误。我的建议是用空格替换不可打印的字符并执行查询
【讨论】:
以上是关于来自平面文件的 GPFdist 插入会在插入时引发错误“用于编码“UTF8”的字节序列无效:0x00”的主要内容,如果未能解决你的问题,请参考以下文章
SSIS - 如何从平面文件插入到具有日期范围的OLE DB?
如何在 SSIS 中使用空格作为分隔符从平面文件中插入数据?