如何将数据从Cassandra表复制到另一个结构以获得更好的性能

ast*_*nlu 13 cql cassandra cql3 cqlsh

在一些地方,建议根据我们要对它们执行的查询来设计我们的Cassandra表.在DataScale的这篇文章中,他们说明了这一点:

事实是,在Cassandra中拥有许多具有类似数据的类似表格是一件好事.将主键限制为您将要搜索的内容.如果您计划使用类似但不同的标准搜索数据,请将其设为单独的表.以不同方式存储相同数据没有缺点.重复数据是您在Cassandra的朋友.

[...]

如果您需要在14个不同的表中存储相同的数据,则将其写出14次.多次写入没有障碍.

我已经理解了这一点,现在我的问题是:只要我有一张现有的桌子,比如说

CREATE TABLE invoices (
    id_invoice int PRIMARY KEY,
    year int,
    id_client int,
    type_invoice text
)
Run Code Online (Sandbox Code Playgroud)

但我希望按年份和类型进行查询,所以我希望有类似的东西

CREATE TABLE invoices_yr (
    id_invoice int,
    year int,
    id_client int,
    type_invoice text,
    PRIMARY KEY (type_invoice, year)
)
Run Code Online (Sandbox Code Playgroud)

使用id_invoice分区键和year聚类键,将数据从一个表复制到另一个表以便稍后执行优化查询的首选方法是什么?

我的Cassandra版本:

user@cqlsh> show version;
[cqlsh 5.0.1 | Cassandra 3.5.0 | CQL spec 3.4.0 | Native protocol v4]
Run Code Online (Sandbox Code Playgroud)

Ash*_*lam 12

您可以使用cqlsh COPY命令:
要将发票数据复制到csv文件,请使用:

COPY invoices(id_invoice, year, id_client, type_invoice) TO 'invoices.csv';
Run Code Online (Sandbox Code Playgroud)

并在您的案例中将csv文件复制回表invoices_yr使用:

COPY invoices_yr(id_invoice, year, id_client, type_invoice) FROM 'invoices.csv';
Run Code Online (Sandbox Code Playgroud)

如果您有大量数据,您可以使用sstable编写器和sstableloader来更快地加载数据. http://www.datastax.com/dev/blog/using-the-cassandra-bulk-loader-updated


Aar*_*ron 8

为了回应关于COPY命令的说法,这是一个很好的解决方案.

但是,我不同意批量装载机的说法,因为它使用起来非常困难.具体来说,因为您需要在每个节点上运行它(而COPY只需要在单个节点上运行).

要帮助COPY扩展更大的数据集,可以使用PAGETIMEOUTPAGESIZE参数.

COPY invoices(id_invoice, year, id_client, type_invoice) 
  TO 'invoices.csv' WITH PAGETIMEOUT=40 AND PAGESIZE=20;
Run Code Online (Sandbox Code Playgroud)

适当地使用这些参数,我使用COPY成功导出/导入3.7亿行.

有关详细信息,请查看本文标题为:cqlsh copy中的新选项和更好的性能.