我有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% 在查询中不可能包含分区键。
首选哪两种解决方案?
答案 0 :(得分:2)
sc.cassandraTable(keyspace, table).where(s"time>$startTime and time<$endTime)
会更快。您基本上在第一个命令中执行完全抓取的百分比(如果您只拉动总工作量的5%的5%)以获得相同的数据。
在第一种情况下,你是
在第二种情况下,你是
作为附加注释,您还可以将您的案例类类型设置在调用中
sc.cassandraTable[CaseClassObject](keyspace, table)