【问题标题】:Issues using "-f" flag in CQLSH to run a query.cql file在 CQLSH 中使用“-f”标志运行 query.cql 文件的问题
【发布时间】:2023-05-25 15:30:01
【问题描述】:

我正在使用 cqlsh 通过 BATCH 查询向 Cassandra 添加数据,我可以使用“-e”标志通过查询加载数据,但不能从使用“-f”标志的文件中加载数据。我认为这是因为文件是本地的,而 Cassandra 是远程的。详情如下:

这是我的查询示例(显然要插入更多行):

BEGIN BATCH;
INSERT INTO keyspace.table (id, field1) VALUES ('1','value1');
INSERT INTO keyspace.table (id, field1) VALUES ('2','value2');
APPLY BATCH;

如果我通过“-e”标志输入查询,那么它没有问题:

>cqlsh -e "BEGIN BATCH; INSERT INTO keyspace.table (id, field1) VALUES ('1','value1'); INSERT INTO keyspace.table (id, field1) VALUES ('2','value2'); APPLY BATCH;" -u username -p password -k keyspace 99.99.99.99

但如果我将查询保存到文本文件 (query.cql) 并按如下方式调用,我会得到以下输出:

>cqlsh -f query.cql -u username -p password -k keyspace 99.99.99.99

Using 3 child processes

Starting copy of keyspace.table with columns ['id', 'field1'].
Processed: 0 rows; Rate:       0 rows/s; Avg. rate:       0 rows/s
0 rows imported from 0 files in 0.076 seconds (0 skipped).

Cassandra 显然接受命令但不读取文件,我猜这是因为 Cassandra 位于远程服务器上,而文件位于本地。我使用的 Cassandra 实例是其他用户的托管服务,因此我无权访问它来将文件复制到文件夹中。

如何在只有 CLI 访问权限的 Cassandra 远程实例上运行此查询?

我希望能够使用另一个工具来构建 query.cql 文件并让批处理作业运行带有“-f”标志的命令,但我不知道我哪里出错了。

【问题讨论】:

    标签: database cassandra cql cqlsh cassandra-2.1


    【解决方案1】:

    您正在执行 local cqlsh 客户端,因此它应该能够访问您的本地 query.cql 文件。

    尝试删除BEGIN BATCHAPPLY BATCH 并让query.cql 中的2 个INSERT 语句重试。

    另一个快速插入数据的解决方案是提供一个csv文件并在cqlsh中使用COPY命令。阅读这篇博文:http://www.datastax.com/dev/blog/new-features-in-cqlsh-copy

    通过每行生成一个cqlsh -e '...' 进行脚本插入是可行的,但速度会非常慢

    【讨论】:

    • 谢谢doanduyhai。删除 BEGIN BATCHAPPLY BATCH 语句解决了这个问题。我来看看COPY命令,你知道csv文件是否需要特定的格式吗?
    • cqlsh COPY 命令在 CSV 格式方面非常灵活。只需在 cqlsh 中键入 help COPY 即可列出所有可用选项