2016-05-23 76 views
1

我们使用Cassandra来存储一些分析表,例如“用户点击”,“用户登录”等。我们的数据模型的设计方式是我们的应用程序始终使用分区键进行查询,例如“获取用户登录ID“等。但是,有时候,我们需要做一些特别分析,例如”过去6个月每个用户每月平均登录次数是多少?“并为此我们使用Spark SQL。Spark SQL是否使用Cassandra二级索引?

我的问题是这样的:我的理解是,Spark SQL将基本上迭代Cassandra中的每一行,并将SQL查询的条件应用于每一行,丢弃那些不匹配并返回那些匹配的最后应用任何聚合等需要)。如果我在Cassandra列上创建二级索引(例如“登录时间”),然后在Spark SQL中执行类似于“从登录名中选择*,其中登录时间>'2016-05-17'”将Spark SQL按使用二级索引过滤到Cassandra,还是会遍历每一行?是否有一些配置需要设置,以手动告诉它哪些列有索引以便压下索引谓词?

回答

4

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") 

的连接器将获取元数据ta从卡桑德拉bootstrap,并会自动计算出哪些索引可以用于下推

+0

啊,纯粹的SparkSQL是我失踪的一点 - 惊人的,谢谢!据推测,这将与Spark的HiveThriftServer for SparkSQL一起工作? – Matt

相关问题