以下是样本senario,我们在cassandra中有实时数据记录,我们希望在不同的时间范围内聚合数据。我写的代码如下:
val timeRanges = getTimeRanges(report)
timeRanges.foreach { timeRange =>
val (timestampStart, timestampEnd) = timeRange
val query = _sc.get.cassandraTable(report.keyspace, utilities.Helper.makeStringValid(report.scope)).
where(s"TIMESTAMP > ?", timestampStart).
where(s"VALID_TIMESTAMP <= ?", timestampEnd)
......do the aggregation work....
代码的问题在于,对于每个时间范围,聚合工作都不是以并行方式运行的。我的问题是如何平衡聚合工作?既然RDD不能在另一个RDD或Future中运行?有没有办法平行工作,或者我们不能在这里使用火花连接器?
答案 0 :(得分:1)
使用joinWithCassandraTable函数。这允许您使用来自一个RDD的数据来访问C *并拉取记录,就像在您的示例中一样。
{{1}}利用java驱动程序执行单个驱动程序 查询源RDD所需的每个分区,因此不需要 数据将被请求或序列化。这意味着任何之间的联接 可以在不执行完整表的情况下执行RDD和Cassandra表 扫描。当在两个共享的Cassandra表之间进行预测时 相同的分区键不需要在它们之间移动数据 机器。在所有情况下,此方法将使用源RDD 数据位置的分区和放置。
答案 1 :(得分:0)
最后,我们使用union来连接每个RDD并使它们并行化。