我们使用Cassandra存储大量分析表,例如“用户点击”,“用户登录”等。我们的数据模型的设计使我们的应用程序始终通过分区键进行查询,例如“获取登录信息”用户ID“等。但是,有时我们需要进行一些特殊分析,例如”过去6个月内每个用户每月的平均登录次数是多少?“为此,我们使用Spark SQL。
我的问题是:我的理解是Spark SQL将基本遍历Cassandra中的每一行并将SQL查询的条件应用于每一行,丢弃那些不匹配的行并返回那些匹配的行(最后应用所需的任何聚合等)。如果我在Cassandra列上创建二级索引(例如,'登录时间'),然后在Spark SQL中我执行类似“select * from logins where logintime>'2016-05-17'”将Spark SQL推送使用二级索引过滤到Cassandra,还是会遍历每一行?我是否需要设置一些配置来手动告诉它哪些列有索引以便下推索引谓词?
答案 0 :(得分:5)
Spark SQL会使用二级索引将过滤推送到Cassandra,还是会迭代遍历每一行?
是的,当可用时,SparkSQL将使用二级索引执行对CQL的谓词下推
是否需要设置一些配置来手动告诉它哪些列具有索引以便下推索引谓词?
您需要声明的唯一内容是激活谓词下推
1)使用数据框
val df = sqlContext
.read
.format("org.apache.spark.sql.cassandra")
.options(Map( "table" -> "words", "keyspace" -> "test", "pushdown" -> true ))
.load()
2)使用纯 SparkSQL
CREATE TEMPORARY TABLE words
USING org.apache.spark.sql.cassandra
OPTIONS (table "words", keyspace "test", pushdown "true")
连接器将在bootstrap中从Cassandra获取元数据,并自动计算哪些索引可用于下推