使用cqlsh COPY FROM导入TSV时DELIMITER='\t'报错求助
解决cqlsh COPY FROM导入TSV时DELIMITER='\t'报错的问题
问题原因
当在CQL脚本文件中写DELIMITER='\t'时,cqlsh会把\t当作两个独立字符(反斜杠+字母t)处理,而非解析为单个制表符,因此触发"delimiter must be a 1-character string"错误。这并非旧bug复现,而是cqlsh解析CQL文件的规则导致——通过-f参数读取脚本时,cqlsh不会自动解析字符串内的转义序列。
解决方案
方案1:用实际制表符替换转义序列
直接在CQL文件的DELIMITER值中输入真实的制表符(按下Tab键输入),替换原来的\t:
COPY test.simple_table (id, value) FROM '/tmp/import_data.tsv' WITH HEADER=false AND DELIMITER=' '; # 注意:引号内是一个真实的制表符,不是空格
方案2:通过命令行直接执行COPY命令
如果不想修改CQL文件,可将完整命令通过cqlsh的-e参数传递,让shell解析转义序列:
docker run --rm --network cassandra-net -v "$(pwd)/test.tsv:/tmp/import_data.tsv" -e CQLSH_HOST=cassandra-host -e CQLSH_PORT=9042 cassandra /opt/cassandra/bin/cqlsh -e "CREATE KEYSPACE IF NOT EXISTS test WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : '1' }; CREATE TABLE IF NOT EXISTS test.simple_table (id int PRIMARY KEY, value text); COPY test.simple_table (id, value) FROM '/tmp/import_data.tsv' WITH HEADER=false AND DELIMITER='$'\t''"
这里利用shell的$'\t'语法将转义序列解析为实际制表符,再传递给cqlsh。
方案3:配置cqlshrc默认分隔符(可选)
如果频繁导入TSV文件,可在容器内挂载或创建~/.cassandra/cqlshrc文件,添加以下内容设置默认分隔符:
[copy] delimiter = \t
之后执行COPY命令时无需指定DELIMITER参数,cqlsh会自动使用制表符作为分隔符。
内容的提问来源于stack exchange,提问作者Mauro Meneghin
相关产品推荐
相关产品推荐

