我在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)")
让它工作(列日期的类型为(日期)
1条答案
按热度按时间b09cbbtk1#
当您没有分区密钥的条件时,spark cassandra连接器使用令牌范围并行执行有效扫描。如果你对某个聚类列有条件
clasCol
(如您的示例中所示更大),连接器将生成以下查询(伪代码,而不是真实代码-如果启用调试日志记录,您可以找到真实的cql查询):然后cassandra将对同一节点上的多个分区执行有效范围扫描。如果需要更多详细信息,可以在此处查找代码。
关于
date
-这需要更多地研究代码,但可能只是缺少一些类型转换,或者类似的东西—您可以检查为这两种情况生成了哪些查询。