当前位置: 首页 > 知识库问答 >
问题:

火花下推过滤器如何与cassandra表非分区键一起工作?

滑弘扬
2023-03-14

我在cassandra中有一个表,其中日期不是分区键的一部分,但它是聚类键的一部分。在读取火花中的表时,我正在应用日期过滤器,它正在向下推送。我想了解下推是如何工作的,因为通过cql,我们不能直接查询集群键。数据是否在某处被过滤?

Java实施:

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

物理平面图显示为

==物理计划==*项目[customer_user_id#67 AS customerUserId#111,演员阵容(时间戳#66作为日期)AS日期#112,城市#70]-*过滤器(isnotnull(时间戳#66)

对于时间戳部分,这也很好,但是如果列是< code>date类型,那么即使date是分区键的一部分,也不会推送过滤器。我不得不把它写成< code>transactions.filter("date

共有1个答案

柴赞
2023-03-14

当您对分区键没有条件时,Spark Cassandra连接器使用令牌范围并行执行有效扫描。因此,如果您对某个集群列<code>clasCol</code>有条件(与示例中更大),连接器将生成以下查询(伪代码,而非真实代码-如果启用调试日志记录,您可以找到真实的CQL查询):

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

然后,Cassandra将对同一节点上的多个分区执行有效的范围扫描。如果需要更多详细信息,可以在此处查找代码。

关于< code > date ——这需要更多地查看代码,但可能只是缺少了一些类型转换,或者类似的东西——您可以检查这两种情况下都生成了什么查询。

 类似资料:
  • 我正在使用火花流,我从Kafka读取流。阅读此流后,我将其添加到hazelcast地图中。 问题是,我需要在读取Kafka的流之后立即从地图中过滤值。 我正在使用下面的代码来并行化地图值。 但在这个逻辑中,我在另一个逻辑中使用JavaRDD,即JavaInputDStream.foreachRDD,这会导致序列化问题。 第一个问题是,如何通过事件驱动来运行spark作业? 另一方面,我只是想得到一

  • 我有一个简单的过滤器,用于检查请求是否包含一个带有静态密钥的特殊头(无用户身份验证),以保护endpoint。这个想法是,如果键不匹配,抛出一个,然后映射到带有注释的类的响应。但是我不能让它工作。我的未被调用。 客户端 访问禁止例外 例外控制器 我错在哪里了?简单的servlet过滤器可以与Spring Boot的异常映射一起工作吗?

  • 我想知道Kafka分区是如何在从executor进程内部运行的SimpleConsumer之间共享的。我知道高水平的Kafka消费者是如何在消费者群体中的不同消费者之间分享利益的。但是,当Spark使用简单消费者时,这是如何发生的呢?跨计算机的流作业将有多个执行程序。

  • 我想过滤掉具有“c2”列前3个字符的记录,无论是“MSL”还是“HCP”。 所以输出应该如下所示。 有谁能帮忙吗? 我知道df。过滤器($c2.rlike(“MSL”))--用于选择记录,但如何排除记录? 版本:Spark 1.6.2 Scala:2.10

  • 我有一个包含特殊字符的字符串列表 它像这样工作得很好 输出 安得拉邦 卡纳塔克邦 当我使用过滤器来做这件事时 它不起作用!我把名单原封不动地拿回来了。 我期待着这样一份清单['Andhra Pradesh','Karnataka'] 我希望从字符串列表中删除特殊字符,如,和