spark下推筛选器如何处理cassandra表的非分区键?

jpfvwuh4  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(435)

我在cassandra中有一个表,其中date不是分区键的一部分,而是集群键的一部分。在spark中读取表格时,我正在应用日期过滤器,它被向下推。我想了解下推是如何工作的,因为通过cql我们不能直接查询集群密钥。数据是否在某处被过滤?
java实现:

transactions.filter(transactions.col("timestamp").gt(timestamp))  //column timestamp is of type timestamp

而实际计划是 == Physical Plan == *Project [customer_user_id#67 AS customerUserId#111, cast(timestamp#66 as date) AS date#112, city#70] +- *Filter (isnotnull(timestamp#66) && isnotnull(city#70)) +- *Scan org.apache.spark.sql.cassandra.CassandraSourceRelation@571db8b4 [customer_user_id#67,timestamp#66,city#70] PushedFilters: [IsNotNull(timestamp), *GreaterThan(timestamp,2018-08-13 00:00:00.0), IsNotNull(city)], ReadSchema: struct<customerUserId:int,date:date,city:string> 同样对于时间戳部分,这个工作正常,但如果列的类型是 date 即使date是分区键的一部分,if也没有按下过滤器。我不得不把它写成 transactions.filter("date >= cast('" + timestamp + "'as date)") 让它工作(列日期的类型为(日期)

b09cbbtk

b09cbbtk1#

当您没有分区密钥的条件时,spark cassandra连接器使用令牌范围并行执行有效扫描。如果你对某个聚类列有条件 clasCol (如您的示例中所示更大),连接器将生成以下查询(伪代码,而不是真实代码-如果启用调试日志记录,您可以找到真实的cql查询):

SELECT col1, col2, ... FROM ks.table WHERE
  token(pk) > :startRange AND token(pk) <= :endRange
  AND clasCol > :your-value ALLOW FILTERING;

然后cassandra将对同一节点上的多个分区执行有效范围扫描。如果需要更多详细信息,可以在此处查找代码。
关于 date -这需要更多地研究代码,但可能只是缺少一些类型转换,或者类似的东西—您可以检查为这两种情况生成了哪些查询。

相关问题