Spark和cassandra,关于聚类键的范围查询

时间:2016-04-01 15:44:42

标签: apache-spark cassandra spark-cassandra-connector

我有cassandra表,结构如下:

  

CREATE TABLE表(    key int,    时间戳,    测量浮动,    主键(键,时间)   );

我需要创建一个Spark作业,它将从上一个表中读取数据,在指定的开始和结束时间戳中进行一些处理,并将结果刷新回cassandra。

所以我的spark-cassandra-connector必须对集群cassandra表列进行范围查询。

如果我这样做,会有任何性能差异:

sc.cassandraTable(keyspace,table).
as(caseClassObject).
filter(a => a.time.before(startTime) && a.time.after(endTime).....

所以我正在做的是将所有数据加载到Spark并应用过滤

或者,如果我这样做:

sc.cassandraTable(keyspace, table).
where(s"time>$startTime and time<$endTime)......

过滤Cassandra中的所有数据,然后将较小的子集加载到Spark。

范围查询的选择性约为1% 在查询中不可能包含分区键。

首选哪两种解决方案?

1 个答案:

答案 0 :(得分:2)

sc.cassandraTable(keyspace, table).where(s"time>$startTime and time<$endTime)

会更快。您基本上在第一个命令中执行完全抓取的百分比(如果您只拉动总工作量的5%的5%)以获得相同的数据。

在第一种情况下,你是

  1. 阅读Cassandra的所有数据。
  2. 序列化每个对象,然后将其移动到Spark。
  3. 然后最后过滤所有内容。
  4. 在第二种情况下,你是

    1. 仅从C *
    2. 中读取您真正想要的数据
    3. 仅序列化这个小子集
    4. 没有第3步
    5. 作为附加注释,您还可以将您的案例类类型设置在调用中

      sc.cassandraTable[CaseClassObject](keyspace, table)