【问题标题】:Cassandra - join two tables and save result to new tableCassandra - 连接两个表并将结果保存到新表
【发布时间】:2015-03-20 21:13:40
【问题描述】:

我正在开发一个 self-bi 应用程序,用户可以上传他们自己的数据集,这些数据集存储在动态创建的 Cassandra 表中。数据是从用户可以上传的文件中提取的。因此,每个数据集都会写入自己的 Cassandra 表,该表基于上传文件中的列标题建模,同时对维度进行索引。

一旦上传数据,用户就可以从应用程序中构建报告、分析等。我需要一种方法来允许用户根据匹配键合并/连接来自两个或多个数据集/表的数据,并将结果写入新的 Cassandra 表。创建数据集/表后,它将保持不可变,并且仅从中读取数据。

用户表 1

  1. 用户名
  2. 电子邮件
  3. 员工编号

用户表 2

  1. 员工编号
  2. 经理

我需要合并 user 表 1user 表 2 中的数据以匹配 employee id 并写入 新表 是动态创建的。

新表

  1. 用户名
  2. 电子邮件
  3. 员工编号
  4. 经理

最好的方法是什么?

【问题讨论】:

  • 所以有人点击了一些东西,你需要创建表并遍历表 1 和表 2,获取匹配的内容并将其写入新表?这是一次性操作,之后该表只被读取?

标签: cassandra cql3 datastax-java-driver


【解决方案1】:

您唯一的选择是在您的应用程序代码中加入。只有很少的细节可以提出适当的解决方案。

请添加有关表键、使用模式的详细信息...一般而言,在 cassandra 中,您从使用的角度进行建模,即从您将对数据执行的查询开始。

为了在此模式下合并 2 个表,您必须在应用程序中执行此操作,创建第三个表(目标表)并用两个表中的数据填充它。您必须确保读取页面中的数据而不是OOM,这实际上取决于数据的大小。

另一种选择是将联接构建到 Spark 中,但在您的情况下可能过于工程化。

【讨论】:

  • 谢谢。我将尝试与 Spark 进行合并,因为数据集有时会很大。
【解决方案2】:

您可以将表与用户的primary key 合并,以便合并的数据进入一行,并且应该是唯一的,因为它是一次性操作。

当用户单击时,您可以使用fetch size 分批浏览一个表(对于java,您可以检查query options,但这是一种固定窗口的方法,该窗口将被加载并在达到时移动到下一个提取大小元素)。假设您获取了 1000 个项目的大小,从一个表中迭代它们并在第二个表中找到匹配项,并在达到 1000 个后将 1000 个插入批次放置到新表中。

如果这很耗时,您可以按照建议使用其他工具,如 Apache Spark 或 Spring Batch,并在后台执行此操作,通知用户它将发生。

【讨论】:

    猜你喜欢
    • 2019-08-15
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    相关资源
    最近更新 更多