Spark SQL 和 Cassandra 的 JOIN

4
我的Cassandra模式包含一个带有时间戳分区键和一个作为聚簇键的“参数”列的表。
每个分区包含10k+行。这是以每秒1个分区的速率记录数据。
另一方面,用户可以定义“数据集”,我有另一个表,其中包含“数据集名称”作为分区键和指向另一个表的时间戳作为聚簇列(因此,“数据集”是分区键列表)。
当然,我想做的看起来像是Cassandra的反模式,因为我想连接两个表。
但是使用Spark SQL,我可以运行这样的查询并执行JOIN。
SELECT * from datasets JOIN data 
    WHERE data.timestamp = datasets.timestamp AND datasets.name = 'my_dataset'

现在的问题是:Spark SQL是否足够智能,只读取与数据集中定义的时间戳相对应的分区?
1个回答

4

编辑:修正关于连接优化的答案

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


1
你确定它可以推送形式为 column = column 的谓词吗?如果可以,能否提供一些参考资料。就我目前所见,Spark 只考虑形如 column = value 的谓词。 - zero323
2
连接操作没有优化,但是对于 AND datasets.name = 'my_dataset' 存在谓词下推。如果您想让 Spark/Cassandra 连接器优化连接操作,您需要使用 RDD 编程 API (joinWithCassandraTable)。 - doanduyhai
谢谢。所以答案应该是否定的,不是吗?就我理解而言,OP询问的是连接条件而不是谓词。 - zero323
谢谢您提供的答案和评论!这意味着我应该添加类似于 AND data.timestamp IN (x) 这样的内容,其中 x 是通过读取 datasets 表中某个分区获取的时间戳列表。这样做有意义吗? - Cedric H.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接