火花下推式过滤器如何与cassandra表非分区键一起使用?

时间:2018-12-13 10:01:30

标签: apache-spark cassandra

我在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)")才能正常工作。 (列日期是日期类型)

1 个答案:

答案 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-它需要更多地研究代码,但也许只是缺少类型转换或类似的东西-您可以检查在两种情况下都生成了哪些查询。