Docker中Cassandra用COPY导入CSV报错:Struct()需字符串而非unicode
解决Docker容器内Cassandra导入CSV时的"Struct() argument 1 must be string, not unicode"错误
以下是针对这个错误的几种排查和解决方法:
升级Cassandra版本:这个错误多出现于2.x系列的旧版本,这类版本对Unicode字符的处理存在兼容性问题。如果你的Cassandra版本较低,建议升级到3.x及以上版本,新版本对字符编码的支持更完善。
在COPY命令中指定编码:显式指定CSV文件的编码为UTF-8,解决编码不匹配导致的识别问题,修改后的命令如下:
COPY keyspace.table_name (id,id_type,location_id,event_source,event_name,message_json,source_ts,timestamp) FROM '/myFile0.csv' WITH DELIMITER=',' AND HEADER=TRUE AND ENCODING='UTF8';
预处理CSV文件:如果CSV包含特殊字符或非标准编码内容,先在容器内做清理:
- 用
iconv转换编码:
之后导入转换后的iconv -f ISO-8859-1 -t UTF-8 /myFile0.csv > /myFile0_utf8.csvmyFile0_utf8.csv文件 - 用
sed去除不可见字符:sed 's/[^[:print:]]//g' /myFile0.csv > /cleaned_file.csv
- 用
检查结构化字段格式:错误提示涉及Struct,大概率是
message_json字段的JSON内容有问题。要确保CSV里的JSON格式完全合法,没有未闭合的引号、括号等语法错误,同时所有字符串都是标准UTF-8编码。可以先抽取几条JSON内容单独验证合法性。指定编码启动cqlsh:进入容器的cqlsh时显式指定编码,避免终端与文件编码不匹配:
docker exec -it <容器ID/名称> cqlsh --encoding utf8
之后再执行COPY命令。
内容的提问来源于stack exchange,提问作者user19785518
相关产品推荐
相关产品推荐

