Я пытаюсь скопировать большой набор данных из 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» не может декодировать байт 0xc3 в позиции 9: порядковый номер не в диапазоне (128)
Мои данные и имена столбцов, в том числе уже в созданной таблице в ScyllaDB, содержат значения с текстом на немецком языке.Это не ASCII, но я не нашел нигде, чтобы установить кодировку, и везде, где я смотрел, казалось, уже используется utf-8
.Я также попытался this и увидел в окрестности строки 1135 что, и изменил его в моем локальном cqlsh (используя vim $(which cqlsh)
), но это не дало никакого эффекта.
I 'м, используя cqlsh 5.0.1
, устанавливается с помощью пипа.(странно, это было pip install cqlsh==5.0.4
)
Я также попробовал cqlsh
из образа докера, который я использовал для установки ScyllaDB , и он имеет точно такую же ошибку.
Как и предполагалось, я передал данные в файл:
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, я сделал это:
>>> 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» не может декодировать байт 0xd1 в позиции 2: порядковый номер не находится в диапазоне (128) Как только я добавил последние 2 строки в cqlsh.py
в начале, он прошел проблему с декодированием, нотот же столбец был объявлен недействительным с другой ошибкой:
: 1: недопустимое имя столбца Ist Einpöster
примечание:
На данный момент я потерял интерес к этому тесту, и я просто пытаюсь не задавать вопрос без ответа, поэтому, пожалуйста, извините за время ожидания.Когда я пробовал это в качестве аналитического движка в сочетании со Spark в качестве источника данных для Tableau, я нашел «лучшие» альтернативы, такие как Vertica и ClickHouse.«Лучше», потому что у них обоих есть ограничения.
Как мне завершить этот импорт?