我的Cassandra架构包含一个表,其中包含一个时间戳的分区键,以及一个作为聚类键的 parameter
列 .
每个分区包含10k行 . 这是以每秒1个分区的速率记录数据 .
另一方面,用户可以定义“数据集”,我有另一个表,其中包含作为分区键的“数据集名称”和一个聚类列,它是一个引用另一个表的时间戳(因此“数据集”是一个列表分区键) .
当然,我想做的事情看起来像Cassandra的反模式,因为我想加入两张 table .
但是使用Spark SQL我可以运行这样的查询并执行 JOIN
.
SELECT * from datasets JOIN data
WHERE data.timestamp = datasets.timestamp AND datasets.name = 'my_dataset'
现在的问题是:Spark SQL是否足够聪明,只能读取 data
的分区,这些分区对应于 datasets
中定义的 timestamp
?
1 回答
编辑:修复关于连接优化的答案
实际上,由于您为数据集表提供了分区键,因此Spark / Cassandra连接器将执行 predicate push down 并直接在Cassandra中使用 CQL 执行分区限制 . 但是除非你使用带有
joinWithCassandraTable()
的RDD API,否则不会有连接操作本身的谓词下推请参阅此处了解所有可能的谓词下推情况:https://github.com/datastax/spark-cassandra-connector/blob/master/spark-cassandra-connector/src/main/scala/org/apache/spark/sql/cassandra/BasicCassandraPredicatePushDown.scala