首页 文章

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

提问于
浏览
0

我有以下结构的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 回答

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

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

    在第一种情况下,你是

    • 阅读Cassandra的所有数据 .

    • 序列化每个对象,然后将其移动到Spark .

    • 然后最后过滤一切 .

    在第二种情况下,你是

    • 仅从C *中读取您真正想要的数据

    • 仅序列化这个小子集

    • 没有第3步

    作为附加注释,您还可以将您的案例类类型放在调用中

    sc.cassandraTable[CaseClassObject](keyspace, table)
    

相关问题