将cassandra查询结果导出到csv文件

Dad*_*y09 39 cassandra cqlsh

我是cassandra的新手,我必须将特定查询的结果导出到csv文件.

我找到了COPY命令,但是(据我所知)它只允许你将现有的表复制到csv文件,我想要的是直接将查询的stdout复制到csv文件.有没有办法用COPY命令或用其他方式做到这一点?

我的命令是style(select column1, column2 from table where condition = xy),我正在使用cqlsh.

Aar*_*ron 49

如果您不介意使用管道("|")作为分隔符来处理数据,则可以尝试-e在cqlsh上使用该标志.该-e标志允许您从命令提示符向Cassandra发送查询,您可以在其中重定向甚至在输出上执行grep/awk/whatever.

$ bin/cqlsh -e'SELECT video_id,title FROM stackoverflow.videos' > output.txt
$ cat output.txt

 video_id                             | title
--------------------------------------+---------------------------
 2977b806-df76-4dd7-a57e-11d361e72ce1 |                 Star Wars
 ab696e1f-78c0-45e6-893f-430e88db7f46 | The Witches of Whitewater
 15e6bc0d-6195-4d8b-ad25-771966c780c8 |              Pulp Fiction

(3 rows)
Run Code Online (Sandbox Code Playgroud)

较旧版本的cqlsh没有该-e标志.对于旧版本的cqlsh,您可以将命令放入文件中,然后使用该-f标志.

$ echo "SELECT video_id,title FROM stackoverflow.videos;" > select.cql
$ bin/cqlsh -f select.cql > output.txt
Run Code Online (Sandbox Code Playgroud)

从这里开始,cat在output.txt上执行操作应该产生与上面相同的行.

  • 这样就可以在CSV中提供100个结果,如果我们的结果比通过在交互模式中单击"更多"检索的结果更多,那么我们如何才能获得CSV? (7认同)
  • @JagratiGogia在查询前添加了“ PAGING OFF;”。例如`cqlsh -e“ PAGING OFF; SELECT * FROM stackoverflow.videos;” (6认同)
  • @ user3196353您必须在旧版本上运行.编辑make ...尝试用命令文件替换-f. (2认同)

Aru*_*run 36

  1. 使用CAPTURE命令将查询结果导出到文件.
cqlsh> CAPTURE
cqlsh> CAPTURE '/home/Desktop/user.csv';
cqlsh> select *from user;
Now capturing query output to '/home/Desktop/user.csv'.
Run Code Online (Sandbox Code Playgroud)

现在,在/home/Desktop/user.csv中查看查询的输出

  1. 使用DevCenter并执行查询.右键单击输出并选择"全部复制为CSV"以将输出粘贴为CSV.

在此输入图像描述

  • 这(选项 1)似乎是比已接受的答案更好的选择。 (2认同)
  • 实际上,我认为我误解了 - 选项 1 不以 CSV 格式输出,它只是将现有输出重定向到名称以 .csv 结尾的文件,对吧? (2认同)

Ale*_*Ott 13

2020 年,您可以使用DSBulk将数据导出到 CSV(默认情况下)或 JSON,或从 CSV(默认情况下)或 JSON 导入数据。它可以很简单:

dsbulk unload -k keyspace -t table -u user -p password -url filename
Run Code Online (Sandbox Code Playgroud)

DSBulk 针对快速数据导出进行了大量优化,不会在您刚刚运行时给协调器节点带来太多负载select * from table

您可以控制要导出的列,甚至提供您自己的查询等。有关示例,请参阅以下博客文章:


pop*_*rny 10

我刚刚编写了一个工具来将CQL查询导出为CSV和JSON格式.试试看 :)

https://github.com/tenmax/cqlkit


小智 8

您可以使用 COPY 命令创建 CSV 文件。例如复制带有选定列的表。列是可选的,如果您选择它们​​,则将选择每一列。

COPY TABLE (COL1, COL2) TO 'filename.csv' HEADER=TRUE/FALSE

更多参考 https://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlshCopy.html

  • 但是如何添加“where”条件呢? (7认同)

小智 7

无法评论...要处理超过 100 行时的“MORE”问题,只需在 SQL 前添加“paging off”即可。

就像是

$ bin/cqlsh -e'PAGING OFF;SELECT video_id,title FROM stackoverflow.videos' > output.txt
Run Code Online (Sandbox Code Playgroud)

这会导致输出文件的开头有点混乱,但之后可以轻松删除。


Jak*_*ake 7

使用bash:

如果您需要查询数据(无法使用 COPY TO)并且需要可导入最终产品(即使用 COPY FROM):

cqlsh -e "SELECT * FROM bar WHERE column = 'baz' > raw_output.txt
Run Code Online (Sandbox Code Playgroud)

然后您可以使用以下命令重新格式化输出sed

sed 's/\ //g; /^----.*/d; /^(/d; /^\s*$/d;' raw_output.txt | tee clean_output.csv
Run Code Online (Sandbox Code Playgroud)

这几乎说明了

sed 'remove spaces; remove the column boarder; remove lines beginning with (COUNT X); and remove blank lines' | write output into clean_output.csv
Run Code Online (Sandbox Code Playgroud)

可以清理 sed 正则表达式以更好地适合您的具体情况,但这就是总体思路。


pha*_*act 5

我相信 DevCenter 也允许您复制到 CSV。 http://www.datastax.com/what-we-offer/products-services/devcenter