【问题标题】:How to copy data from a Cassandra table to another structure for better performance如何将数据从 Cassandra 表复制到另一个结构以获得更好的性能
【发布时间】:2017-05-17 19:58:35
【问题描述】:

在一些地方,建议根据我们要对其执行的查询来设计我们的 Cassandra 表。他们在this article by DataScale 中声明:

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

[...]

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

我已经明白了,现在我的问题是:假设我有一个现有的表,比如说

CREATE TABLE invoices (
    id_invoice int PRIMARY KEY,
    year int,
    id_client int,
    type_invoice text
)

但我想按年份查询并输入,所以我想要类似的东西

CREATE TABLE invoices_yr (
    id_invoice int,
    year int,
    id_client int,
    type_invoice text,
    PRIMARY KEY (type_invoice, year)
)

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

我的 Cassandra 版本:

user@cqlsh> show version;
[cqlsh 5.0.1 | Cassandra 3.5.0 | CQL spec 3.4.0 | Native protocol v4]

【问题讨论】:

  • 你有香草 C*(火花?)?什么版本(如果物化视图可用)?
  • 关于声明“数据复制是你在Cassandra中的朋友”,我强烈建议不要这样做。数据重复不是你的朋友。它可能导致同步问题和数据损坏。充其量是一个不应该完全信任或依赖的熟人。
  • 我不认为“数据重复不是你的朋友”作为一般性陈述,在大数据数据库的背景下也不能轻描淡写。

标签: cassandra cql cql3 cqlsh


【解决方案1】:

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

COPY invoices(id_invoice, year, id_client, type_invoice) TO 'invoices.csv';

并在您的情况下从 csv 文件复制回表格 invoices_yr 使用:

COPY invoices_yr(id_invoice, year, id_client, type_invoice) FROM 'invoices.csv';

如果您有大量数据,您可以使用 sstable writer 进行写入,并使用 sstableloader 更快地加载数据。 http://www.datastax.com/dev/blog/using-the-cassandra-bulk-loader-updated

【讨论】:

    【解决方案2】:

    为了呼应关于 COPY 命令的内容,这是解决此类问题的绝佳解决方案。

    但是,我不同意关于 Bulk Loader 的说法,因为它无限难以使用。具体来说,因为您需要在每个节点上运行它(而 COPY 只需要在单个节点上运行)。

    为了帮助 COPY 扩展更大的数据集,您可以使用 PAGETIMEOUTPAGESIZE 参数。

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

    适当地使用这些参数,我之前已经使用 COPY 成功导出/导入了 3.7 亿行。

    有关更多信息,请查看标题为:New options and better performance in cqlsh copy 的文章。

    【讨论】:

      【解决方案3】:

      使用 COPY 命令(有关示例,请参阅其他答案)或 Spark 迁移数据的替代方法是创建一个物化视图来为您执行非规范化。

      CREATE MATERIALIZED VIEW invoices_yr AS
             SELECT * FROM invoices
             WHERE id_client IS NOT NULL AND type_invoice IS NOT NULL AND id_client IS NOT NULL
             PRIMARY KEY ((type_invoice), year, id_client)
             WITH CLUSTERING ORDER BY (year DESC)
      

      Cassandra 将为您填满表格,因此您不必自行迁移。对于 3.5,请注意修复效果不佳(请参阅 CASSANDRA-12888)。

      注意:物化视图可能不是最好的使用方法,并且已更改为“实验”状态

      【讨论】:

      • 嘿克里斯!关于 3.5 中修复的好提示。
      • 克里斯,您的示例引发以下错误:InvalidRequest: code=2200 [Invalid query] message="Cannot include more than one non-primary key column 'year' in materialized view partition key"
      • "物化视图的要求:源表主键的列必须是物化视图主键的一部分。物化视图的主键只能添加一个新列。静态列是不允许。"
      • 物化视图很有希望,但就目前而言,解决方案涉及修改原始表并添加集群键,以便它们可以包含在物化视图中,并且可以防止更新。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 2017-09-02
      • 1970-01-01
      相关资源
      最近更新 更多