我在cassandra中有一个表,其中的日期不是分区键的一部分,但它是集群键的一部分。在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
,则即使日期是分区键的一部分,也没有推送过滤器。我必须将其写为transactions.filter("date >= cast('" + timestamp + "'as date)")
才能正常工作。 (列日期是日期类型)
答案 0 :(得分:0)
当您对分区键没有条件时,Spark Cassandra连接器将使用令牌范围并行执行有效扫描。因此,如果您对某些群集列clasCol
(如您的示例中的条件)有条件,连接器将生成以下查询(伪代码,不是真实代码-如果启用调试日志记录,则可以找到真实的CQL查询):< / p>
SELECT col1, col2, ... FROM ks.table WHERE
token(pk) > :startRange AND token(pk) <= :endRange
AND clasCol > :your-value ALLOW FILTERING;
然后,Cassandra将对同一节点上的多个分区执行有效的范围扫描。如果您需要更多详细信息,可以寻找code here。
关于date
-它需要更多地研究代码,但也许只是缺少类型转换或类似的东西-您可以检查在两种情况下都生成了哪些查询。