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