Spark SQL是否使用Cassandra二级索引?

Mat*_*att 2 indexing cassandra apache-spark apache-spark-sql

我们使用Cassandra存储许多分析表,例如"用户点击","用户登录"等.我们的数据模型的设计使我们的应用程序始终通过分区键进行查询,例如"获取用户ID的登录"然而,有时我们需要进行一些特殊的分析,例如"过去6个月每个用户每月的平均登录次数是多少?" 为此,我们使用Spark SQL.

我的问题是:我的理解是Spark SQL将基本遍历Cassandra中的每一行,并将SQL查询的条件应用于每一行,丢弃那些不匹配的行并返回那些匹配的行(并最终应用任何聚合等等).如果我在Cassandra列上创建一个二级索引(例如,'登录时间'),然后在Spark SQL中我执行类似"select*from logins where logintime>'2016-05-17'"将Spark SQL推送使用二级索引过滤到Cassandra,还是仍会遍历每一行?是否有一些配置需要设置为手动告诉它哪些列具有索引以便下推索引谓词?

doa*_*hai 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()
Run Code Online (Sandbox Code Playgroud)

2)使用纯SparkSQL

CREATE TEMPORARY TABLE words
USING org.apache.spark.sql.cassandra
OPTIONS (table "words", keyspace "test", pushdown "true")
Run Code Online (Sandbox Code Playgroud)

连接器将在引导程序中从Cassandra获取元数据,并自动计算哪些索引可用于下推