我有以下结构的cassandra表:
CREATE TABLE表(key int,time timestamp,measure float,primary key(key,time));
我需要创建一个Spark作业,它将从上一个表中读取数据, within specified start and end timestamp 做一些处理,并将结果刷新回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 回答
会更快 . 您基本上在第一个命令中执行完全抓取的百分比(如果您只拉动5%的数据,占总工作量的5%)以获得相同的数据 .
在第一种情况下,你是
阅读Cassandra的所有数据 .
序列化每个对象,然后将其移动到Spark .
然后最后过滤一切 .
在第二种情况下,你是
仅从C *中读取您真正想要的数据
仅序列化这个小子集
没有第3步
作为附加注释,您还可以将您的案例类类型放在调用中