Я пытаюсь скопировать большой набор данных из 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
. Я также попробовал это и увидел около строки 1135, что и изменил его в моем локальном cqlsh (используя vim $(which cqlsh)
), но это не повлияло.
Я использую cqlsh 5.0.1
, установленный с помощью pip. (как ни странно было pip install cqlsh==5.0.4
)
Я также попробовал cqlsh
из образа докера, который я использовал для установки ScyllaDB, и он имеет точный та же ошибка.
‹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, я сделал следующее:
>>> 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. «Лучше», потому что у них обоих есть ограничения.
‹/Update›
Как я могу завершить этот импорт?
echo "not important what you write here" | cqlsh --encoding='utf-8' -e 'COPY test.whatever (id, "ö") FROM STDIN WITH DELIMITER = $$;$$ AND HEADER = TRUE;'
Должно существовать только пространство ключей. Остальное терпит неудачу до любой проверки структуры. Это, очевидно, синтаксический анализатор запроса, поскольку позиция недопустимого символа - это позицияö
в имени столбца. - person AlexanderMP   schedule 29.11.2018