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

时间:2014-11-13 12:56:25

标签: cassandra cqlsh

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

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

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

14 个答案:

答案 0 :(得分:42)

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

$ 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)

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

$ echo "SELECT video_id,title FROM stackoverflow.videos;" > select.cql
$ bin/cqlsh -f select.cql > output.txt

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

答案 1 :(得分:31)

  1. 使用 CAPTURE 命令将查询结果导出到文件中。
  2. cqlsh> CAPTURE
    cqlsh> CAPTURE '/home/Desktop/user.csv';
    cqlsh> select *from user;
    Now capturing query output to '/home/Desktop/user.csv'.
    

    现在,在 /home/Desktop/user.csv

    中查看查询的输出
    1. 使用DevCenter并执行查询。右键单击输出并选择"全部复制为CSV"将输出粘贴为CSV。
    2. enter image description here

答案 2 :(得分:9)

我刚刚编写了一个工具,可以将CQL查询导出为CSV和JSON格式。试一试:)

https://github.com/tenmax/cqlkit

答案 3 :(得分:4)

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

答案 4 :(得分:4)

在Windows中,应使用双引号括起CQL。

cqlsh -e"SELECT video_id,title FROM stackoverflow.videos" > output.txt

答案 5 :(得分:3)

如果我理解正确,您想将输出重定向到stdout?

将您的cql命令放在一个文件中。我的文件名为select.cql,内容为:

select id from wiki.solr limit 100;

然后发出以下内容并将其转到stdout:

cqlsh < select.cql

我希望这会有所帮助。从那里你可以管它并添加逗号,删除标题等。

答案 6 :(得分:1)

使用bash:

如果您需要查询数据(使用COPY TO不可能),并且需要最终产品是可导入的(即使用COPY FROM):

cqlsh -e "SELECT * FROM bar WHERE column = 'baz' > raw_output.txt

然后您可以使用sed

重新格式化输出
sed 's/\ //g; /^----.*/d; /^(/d; /^\s*$/d;' raw_output.txt | tee clean_output.csv

几乎说

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

可以清理sed正则表达式,以更好地适合您的特定情况,但这就是一般想法。

答案 7 :(得分:1)

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

dsbulk unload -k keyspace -t table -u user -p password -url filename

DSBulk经过严格优化,可快速导出数据,而不会给协调器节点增加太多负担,而这只会在您运行select * from table时发生。

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

答案 8 :(得分:0)

无法注释...要处理多于100行的“更多”问题,只需在SQL之前添加“分页”即可。

类似

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

这会在输出文件的开头造成一些混乱,但之后可以轻松将其删除。

答案 9 :(得分:0)

您可以使用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

答案 10 :(得分:0)

CQL COPY是导入或导出数据的不错选择。但是,如果要分析一些小的查询输出,可以在命令下面运行,并将输出保存在文件中。

cqlsh -e“ SELECT * FROM table WHERE column ='xyz'> queryoutput.txt

但是,您也可以使用CAPTURE来保存查询的输出以分析某些内容

答案 11 :(得分:0)

请按照以下步骤选择性地导出和导入Cassandra数据。

导出:

  • 将所有选择查询写入如下所示的名为 dump.cql 的文件中

    分页;

    从id = 10的学生中选择*;

    从id = 15的学生中选择*;

注意: 必须在查询上方进行分页,以避免将查询结果限制为默认100条记录

  • 创建转储

cqlsh -u用户名-p'password'ip_address -k keyspace_name -f dump.cql> dump.csv;

(对于远程计算机)

cqlsh -k keyspace_name -f dump.cql> dump.csv;

(对于本地计算机)

  • 从转储中删除空白字符(避免使用json数据删除空白)

24.0.0

导入:

cqlsh -e“使用定界符='|'从'data_without_spaces.csv'复制keyspace_name.table_name;“

答案 12 :(得分:0)

正如其他人所建议的,使用 ./cqlsh -e 'SELECT ...' > data.csv 导出标准查询输出。

一旦你有了它,你就可以使用 Excel(如果你安装了它)轻松地用逗号替换管道 (|)。

  1. 首先在文本编辑器 (vi/notepad++) 中打开您的文件并删除 Cass 放入的分隔符 (-----+-------+---),以及有关从底部算起的行数。
  2. 打开一个新的 Excel 工作簿。
  3. 点击“数据”标签。
  4. 点击“来自文本/CSV”(左上角)。
  5. 选择您的文件,将管道符号指定为分隔符,然后单击加载。
  6. 这将创建一个 .xlsx 文件,因此您必须手动另存为 .csv。这将删除 Excel 的格式并为您留下逗号。

答案 13 :(得分:-3)

要求提供CSV而不是文本的人。

我这样做是为了获得结果。它对我有用,我继续前进。

me:~/MOOSE2# echo "USE ████it; select * from samples_daily_buffer where dog_id=██48;" | cqlsh --cqlversion="3.4.4" cassandra0.stage.███████ | sed -e "s/ | */,/g" | sed -e "s/^ *//g" | tail -n +4 > ./myfile.csv