我正在尝试将一个大型数据集从 Postgresql 复制到 ScyllaDB,它应该与 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;'
我得到一个没有堆栈跟踪的模糊错误:
:1:'ascii' 编解码器无法解码位置 9 中的字节 0xc3:序数不在范围内(128)
我的数据和列名,包括已经在 ScyllaDB 中创建的表中的那些,包含带有德语文本的值。它不是 ASCII,但我还没有找到任何设置编码的地方,而且在我看来它似乎utf-8
已经在使用的任何地方。我也试过这个,并在 1135 行附近看到,并在我的本地 cqlsh 中更改它(使用vim $(which cqlsh)
),但它没有效果。
我正在使用cqlsh 5.0.1
,使用 pip 安装。(奇怪的是pip install cqlsh==5.0.4
)
我还尝试了我用来安装 ScyllaDBcqlsh
的docker 映像,它有完全相同的错误。
<Update>
按照建议,我将数据通过管道传输到文件中:
psql <db_name> -c "COPY (SELECT row_number() OVER (), * FROM ds.my_data_set ds) TO stdout WITH (FORMAT csv, HEADER);" | head -n 1 > test.csv
我将其细化到第一行(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)
相同的错误文本,所以它也可能是 Python,但没有堆栈跟踪,我不知道这是在哪里发生的,默认编码是utf-8
. 我尝试使用覆盖默认值,utf-8
但没有任何改变。不过,在某个地方,有些东西正在尝试使用 ASCII 解码流。
这是locale
服务器/客户端上的:
LANG=
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
Slack 上的某个人提出了这个答案UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 2: ordinal not in range(128)
一旦我cqlsh.py
在开头添加了最后两行,它就解决了解码问题,但是同一列被报告为无效并出现另一个错误:
:1:无效的列名 Ist Einpöster
边注:
在这一点上,我对这个测试失去了兴趣,我只是想让一个没有答案的问题,所以请原谅等待时间。当我尝试将其作为分析引擎与 Spark 结合作为 Tableau 的数据源时,我发现了“更好”的替代方案,例如 Vertica 和 ClickHouse。“更好”是因为它们都有局限性。
</更新>
如何完成此导入?