Unicode 无法使用cqlsh将UTF-8数据复制到锡拉布

Unicode 无法使用cqlsh将UTF-8数据复制到锡拉布,unicode,stdin,cqlsh,scylla,Unicode,Stdin,Cqlsh,Scylla,我正在尝试将一个大型数据集从Postgresql复制到Scyllab,这应该与Cassandra兼容 这就是我正在尝试的: psql <db_name> -c "COPY (SELECT row_number() OVER () as id, * FROM ds.my_data_set LIMIT 20) TO stdout WITH (FORMAT csv, HEADER, DELIMITER ';');" \ | \ CQLSH_HOST=172.17.0.3 cqlsh -e

我正在尝试将一个大型数据集从Postgresql复制到Scyllab,这应该与Cassandra兼容

这就是我正在尝试的:

psql <db_name> -c "COPY (SELECT row_number() OVER () as id, * FROM ds.my_data_set LIMIT 20) TO stdout WITH (FORMAT csv, HEADER, DELIMITER ';');" \
 | \
CQLSH_HOST=172.17.0.3 cqlsh -e 'COPY test.mytable (id, "Ist Einpöster", [....]) FROM STDIN WITH DELIMITER = $$;$$ AND HEADER = TRUE;'
我将其细化到第一行(CSV标题)。将它输送到
cqlsh
会让它哭出来,并出现同样的错误。然后,使用python3.5交互式shell,我完成了以下操作:

>>> with open('test.csv', 'rb') as fp:
...   data = fp.read()
>>> data
b'row_number,..... Ist Einp\xc3\xb6ster ........`
因此,我们在那里,
\xc3
在肉体中。是UTF-8吗

>>> data.decode('utf-8')
'row_number,....... Ist Einpöster ........`
是的,它是utf-8。那么错误是如何发生的呢

>>> data.decode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 336: ordinal not in range(128)
有人提出了这个答案 一旦我在开始时在
cqlsh.py
中添加了最后2行,它就通过了解码问题,但同一列被报告为无效,并出现另一个错误:

:1:列名Ist Einpöster无效

旁注:

现在我对这个测试失去了兴趣,我只是想尽量不要有一个没有答案的问题,所以请原谅等待的时间。当我试着把它作为一个分析引擎,再加上Spark,作为Tableau的数据源时,我找到了“更好”的替代品,比如Vertica和ClickHouse。“更好”,因为两者都有局限性


我如何才能完成此导入?

我看不出您对此有任何答案。UTF-8应该是默认值

你试过编码吗

文件:


如果你在这里没有得到答案,你愿意在我们的网站上提问吗?

我会先设法消除你在这里遇到的所有额外的复杂性。尝试将几行转储到CSV中,然后使用
COPY

将其加载到Scylla中,它是什么?

作为参数传入的查询包含列列表,其中包含具有非ASCII字符的列。在某些情况下,
cqlsh
将它们解析为ascii而不是
utf-8
,这导致了此错误

它是如何修复的?

第一次尝试是在
cqlsh
中添加这两行:

reload(sys)
sys.setdefaultencoding('utf-8')
但这仍然使脚本无法处理该列

第二次尝试是简单地从文件传递查询。如果不能,请知道bash支持进程替换,因此,请改为:

cqlsh -f path/to/query.cql
你可以

cqlsh -f <(echo "COPY .... FROM STDIN;")
除了cqlsh现在认为您实际上拥有一个文件,并且它像文件一样读取它,所以您可以通过管道传输数据并感到高兴

这可能会奏效,但出于某种原因,我得到了最后一击:

cqlsh.sql:2:未能导入15行:InvalidRequest-服务器错误:code=2200[无效查询]message=“批处理过大”,将稍后重试,尝试5次中的第4次


我觉得有趣的是,15行对于分布式存储引擎来说太多了。很可能是unicode相关引擎的一些限制,只是错误的错误消息。或者我错了。尽管如此,最初的问题还是得到了回答,得到了懒汉们的大力帮助。

更新:utf8:打印无效的UTF-8字符位置

使用错误位置函数添加新的验证位置 如果数据是有效的UTF-8字符串,则返回-1 或者第一个字节的字节位置无效 性格该职位被添加到exception中 “锡拉”中所有UTF-8解析错误的消息

用错误验证\u\u位置分两步完成 通过,以保持相同的性能 在通常情况下,当字符串有效时


我还搜索了错误代码0xc3。这让我想起了一些事情。我想知道您是否在某个地方遇到了一些实际上不是UTF-8,但实际上可能是Unicode的数据。在编码/解码过程中发生了一些事情。我读过这篇文章,是关于人们遇到同样的错误,尽管原因明显不同。但是这些答案可能会帮助你思考错误在哪里。出于好奇,我想试试松驰频道。我认为这不是UTF-8问题,因为它正在根据错误尝试ASCII编解码器。Python可以使用UTF-8.1对流进行解码,没有任何问题。您能否共享Postgresql的模式(包括数据类型)与您在Scylla/Cassandra上创建的模式(包括数据类型)。有时需要进行一些修改。2.你的数据中有空值吗?@TomerSan显然这无关紧要。我现在用
echo“在这里写什么并不重要”|cqlsh--encoding='utf-8'-e'复制test.whatever(id,ö)从STDIN复制了这个错误,使用DELIMITER=$$;$$AND HEADER=TRUE;'仅应存在键空间。其余的在任何结构验证之前都失败了。这显然是查询解析器,因为无效字符的位置是列名中
的位置。我怀疑psql和它有任何关系,因为我们使用这种方法,通过管道将它传输到数百个源,并且从未出现过这个问题。但是我还是尝试了一下,并更新了这个问题。好吧,我觉得这是python的问题。您是否尝试过使用较新的
cqlsh
?我想你可以得到cassandra附带的一个,或者通过
pip
安装最新的一个。我的回答中有详细内容。感谢您的时间和努力。15行失败,因为在每个行中,您的批太大,输出有点混乱
cqlsh -f path/to/query.cql
cqlsh -f <(echo "COPY .... FROM STDIN;")
cqlsh -f <(echo "COPY .... FROM '/dev/stdin';")