卡桑德拉 - 按照正确的方式分组并加入

时间:2016-07-20 09:25:24

标签: apache-spark cassandra

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

2016-06-01 - 2016-07-01

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

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

  1. 按日期{/ 1}创建表user_likes_shares
  2. 通过按键合并数组,将每个列的UDF创建为counter并将其加入代码中
  3. 从3个表组中选择数据,并通过按键合并数组
  4. 将它们连接到代码中
  5. 另一个选择
  6. 如果你使用代码加入结果,你是否使用Apache Spark SQL,在这种情况下,Spark是否正确?

1 个答案:

答案 0 :(得分:1)

假设您的信息中心页面将显示所有历史结果,按日分组:

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

<强> 2。 UDA中的“分组依据”:在此blog post中,作者注意到所有行都被拉回协调器,在那里进行协调和聚合(对于CL&gt; 1)。因此,即使您的clicksshares表按日期分区,Cassandra仍然必须将该日期的所有行拉回协调器,将它们存储在JVM堆中然后处理它们。因此,这种方法降低了可扩展性。

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

<强> 4。 Spark:如果您必须进行即席查询(例如分析数据,而不是填充网页),这是一种很好的方法,可以通过笔记本应用程序运行Spark作业来简化(ag {{3 }})。但是,在您的使用案例中,您必须等待该作业完成,将输出写入某处然后将其显示在网页上。