我们使用Cassandra来存储许多分析表,例如"用户点击"、"用户登录"等。我们的数据模型的设计方式是,我们的应用程序总是通过分区键进行查询,例如"获取用户id的登录名"等。然而,有时,我们需要做一些即席分析,比如"在过去6个月里,每个用户每月的平均登录次数是多少?"为此,我们使用Spark SQL。
我的问题是:我的理解是,Spark SQL基本上会迭代Cassandra中的每一行,并将SQL查询的条件应用到每一行上,丢弃不匹配的条件,返回匹配的条件(最后应用所需的任何聚合等)。如果我在Cassandra列上创建了一个二级索引(例如,"login time"),然后在Spark SQL中,我会执行类似"从logintime>'2016-05-17'的登录中选择*"的操作,Spark SQL会使用二级索引将筛选向下推送到Cassandra,还是仍然会遍历每一行?是否需要设置一些配置来手动告诉它哪些列有索引,以便下推索引谓词?
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")
连接器将在引导程序中从Cassandra获取元数据,并自动确定哪些索引可以用于下推