【问题标题】:Cassandra - do group by and join in the right wayCassandra - 以正确的方式分组并加入
【发布时间】:2018-09-29 05:27:22
【问题描述】:

我知道 - Cassandra 不支持 group by。但是如何在大量数据上实现类似的结果。 假设我有 100 万行 clicks 的表,100 万行 shares 和表 user_profileclicksshares 每行存储一个操作,created_at 列。在仪表板上,我想显示按天分组的结果,例如:

2016-06-01 - 2016-07-01

+-------------+--------+------+
|user_profile |  like  |share |
+-------------+--------+------+
| John        | 34     | 12   |
| Adam        | 12     | 4    |
| Bruce       | 4      | 2    |
+-------------+--------+------+

问题是,我怎样才能以正确的方式做到这一点:

  1. 使用counter 按日期创建表 user_likes_shares
  2. group by每列创建UDF,并通过键合并数组将它们加入代码中
  3. 从 3 个表组中选择数据并通过键合并数组将它们加入代码中
  4. 另一种选择

如果你使用代码来加入结果,你是否使用 Apache Spark SQL,在这种情况下 Spark 是正确的方式吗?

【问题讨论】:

标签: apache-spark cassandra


【解决方案1】:

假设您的仪表板页面将显示所有历史结果,按天分组:

1.表格中的“分组依据”: 非规范化方法是 Cassandra 中公认的处理方式,如 writes and disk space are cheap。如果您可以构建数据模型(和应用程序写入)来支持这一点,那么这是最好的方法。

2。 UDA 中的“分组依据”: 在此blog post 中,作者指出所有行都被拉回协调器,在那里进行协调和聚合(对于 CL>1)。所以即使你的clicksshares 表是按日期分区的,Cassandra 仍然需要将该日期的所有行拉回协调器,将它们存储在 JVM 堆中,然后处理它们。所以这种方法降低了可扩展性。

3。合并代码:这将是一种慢得多的方法,因为您必须将更多数据从协调器传输到应用程序服务器。

4. Spark: 如果您必须进行临时查询(例如分析数据,而不是填充网页),这是一个很好的方法,并且可以通过笔记本应用程序运行 Spark 作业来简化(例如Apache Zeppelin )。但是,在您的用例中,您必须等待该作业完成,将输出写入某处,然后将其显示在网页上,这很复杂。

【讨论】:

  • 能分享一下spark中的操作方法吗?使用普通的 groupBy 方法或带有 DataFrame 的 sql?
  • 根据Spark-Cassandra driver documentationspanBy_/_spanByKey 应该优先于 groupBy 以减少洗牌。关于使用SparkSQL,不知道“GROUP BY”语句会不会翻译成spanBy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 2022-06-12
  • 2023-03-30
  • 2018-08-28
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多