【问题标题】:Export cassandra query result to a csv file将 cassandra 查询结果导出到 csv 文件
【发布时间】:2015-01-10 15:06:29
【问题描述】:

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

我找到了COPY 命令,但是(据我了解)它只允许您将已经存在的表复制到 csv 文件中,而我想要的是将查询的标准输出直接复制到 csv 文件中.有没有办法用COPY 命令或其他方式来做到这一点?

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

【问题讨论】:

    标签: cassandra cqlsh


    【解决方案1】:

    如果您不介意使用竖线 ('|') 作为分隔符的数据,可以尝试在 cqlsh 上使用 -e 标志。 -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)
    

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

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

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

    【讨论】:

    • 是的,它应该可以解决我的问题,这就是我想要做的。除了它不识别 -e 选项。用法:cqlsh [options] [host [port]] ----- 我错过了什么? cqlsh:错误:没有这样的选项:-e
    • @user3196353 您必须在旧版本上运行。进行编辑...尝试 -f 使用命令文件。
    • 太棒了!很高兴我能帮上忙。
    • 这会在 CSV 中提供 100 个结果,如果我们的结果比通过在交互模式下单击“更多”检索到的结果多,我们如何获取 CSV?
    • @JagratiGogia 在您的查询前加上PAGING OFF;。例如。 cqlsh -e "PAGING OFF; SELECT * FROM stackoverflow.videos;"
    【解决方案2】:
    1. 使用CAPTURE命令将查询结果导出到文件中。
    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 很简单,只是 DevCenter 将输出行数限制为 1000,除非您使用的是 1.6:stackoverflow.com/questions/37862375/…
    • 这(选项 1)似乎比公认的答案更好。
    • 其实,我想我理解错了——选项1不会以CSV格式输出,它只是将现有输出重定向到一个名称以.csv结尾的文件,对吧?
    • 是的。您可以使用“COPY TO”将表格中的数据导出到 CSV 文件中。
    【解决方案3】:

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

    https://github.com/tenmax/cqlkit

    【讨论】:

    • 我会试一试...如果有 java8 :(
    • 看起来这是让您以 CSV 格式流式传输输出的唯一答案。 +1。
    【解决方案4】:

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

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

    DSBulk 已针对快速数据导出进行了高度优化,不会像运行 select * from table 时那样在协调器节点上施加过多负载。

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        在 windows 中,应使用双引号将 CQL 括起来。

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

        【讨论】:

          【解决方案7】:

          您可以使用 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-conditions?
          【解决方案8】:

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

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

          select id from wiki.solr limit 100;
          

          然后发出以下命令,然后将其发送到标准输出:

          cqlsh < select.cql
          

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

          【讨论】:

          • 感谢您的回复,但这不是我真正需要的,我正在搜索将我的 sql 查询的输出重定向到 csv 文件(stdout > file.csv),以便我可以使用它在其他工作中
          • 是的,就是这样。存储在 cql 文件中的查询结果输出到 stdout。有时,对于复杂或长查询,您将它们存储在文件中,而不是将它们写入 cmd 行。然后,您可以将带有查询的文件“发送”到 cql,然后将输出发送到 stdout。对于单行查询和简单查询,还有另一种方法。
          • 事后看来,你是对的,我一定是第一次误解了你,其他答案对我来说似乎更清楚一点,对不起
          【解决方案9】:

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

          类似

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

          这会在输出文件的开头造成一些混乱,但之后可以很容易地删除。

          【讨论】:

            【解决方案10】:

            使用 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 正则表达式以更好地适应您的具体情况,但这是一般的想法。

            【讨论】:

            • 当你有很多数据时,这很可能会超时
            • @AlexOtt 我很惊讶,但这正是我尝试这个时发生的事情。很好的收获。
            • @dixon1e 这就是为什么使用 DSBulk 之类的东西处理大量数据很重要...
            • 很好,不知道 DSBulk。非常感谢。
            【解决方案11】:

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

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

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

            【讨论】:

            • 请不要那样做......它根本无法扩展
            【解决方案12】:

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

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

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

            【讨论】:

              【解决方案13】:

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

              导出:

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

                分页;

                select * from student where id=10;

                select * from student where id=15;

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

              • 创建转储

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

              (对于远程机器)

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

              (对于本地机器)

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

              sed -r 's/(\".*\")|\s*/\1/g' dump.csv &gt; data_without_spaces.csv

              导入:

              cqlsh -e "从 'data_without_spaces.csv' 复制 keyspace_name.table_name,分隔符 = '|';"

              【讨论】:

              • 使用cqlsh 是个坏主意 - 有专门的工具,比如 DSBulk 不能这样做
              • 问题是关于转储特定查询,我认为 DSBulk 不支持。
              • 它完全支持...通过-query 选项,尽管对于该查询它不是必需的 - 它只需要导出 2 个特定列。并且给定的查询实际上是扫描整个表,如果您有大量数据,cqlsh 不太支持该表
              【解决方案14】:

              请求的人要求的是 CSV 而不是文本。

              我做了这个 hack 得到了我的结果。它对我有用,我继续我的一天。

              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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-04-04
                • 2017-12-31
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-09-12
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多