我有一个Spark Streaming进程,它实时填充Cassandra表。我想对该 Cassandra 表进行查询,以便访问基础数据。
CQL的语法非常有限(在条件方面受到限制,没有分组依据),所以我正在考虑在它之上使用Spark SQL。
但是一旦我加载数据框,它就不会看到基础数据的任何变化。如何不断刷新数据框,使其始终看到数据变化?
斯尔德扬
这是一个较旧的帖子,但这里似乎有一个反复出现的主题。需要对已摄取到NoSQL存储中的数据进行全功能查询,而Spark SQL提供了做到这一点的能力。走这条路时要考虑的几件事
1> 如果使用 Spark 连接器直接针对数据存储,即使使用谓词下推,也必须将相关列从 Cassandra/其他 NoSQL 存储移动到 Spark 中才能运行查询。缓存已移动到 Spark 中的数据几乎没有意义,因为即席查询可确保下一个查询需要一组不同的数据,这意味着再次重复该过程并导致 Spark 进程中的改动,并抑制性能
2>如果简单地将所有数据从数据存储加载到 Spark 中,那么您会遇到上面提到的过时问题,因为 Spark 是不可变的缓存。一种解决方案是对 Spark 中的数据设置一个 TTL(生存时间),并经常从头开始删除和重新创建数据帧,这是浪费和低效的,并且不清楚在完成时查询会发生什么
一个最好的解决方案(我知道SnappyData是其中之一)只是将数据帧转换为可变实体,以便可以在Spark中对NoSQL存储中的数据进行更改,并且您可以使用Spark SQL执行查询,而无需离开Spark集群或不必将数据移动到Spark中每个查询。这具有显著的性能优势(数据可以以列格式存储,可以修剪查询,可以避免不必要的序列化成本,利用 Spark 中的代码生成来更快地运行查询),降低整体系统复杂性,并允许您构建使用最新数据的连续应用程序。