使用Spark Streaming填充的Cassandra表上的Spark SQL

3
我有一个Spark Streaming进程,实时填充Cassandra表。我想对该Cassandra表进行查询,以访问底层数据。
CQL的语法相当有限(有限的where条件,没有group by),所以我想在其上使用Spark SQL。
但是一旦我加载数据框架,它就不会看到底层数据的任何更改。如何不断地刷新数据框架,以便它们始终看到数据更改?
Srdjan
1个回答

1
我知道这是一个较旧的帖子,但似乎有一个经常出现的主题。需要在已经摄入到NoSQL存储中的数据上进行全面查询,而Spark SQL提供了这种能力。当选择这条路时,要考虑以下几点:
1> 如果直接使用Spark连接器对数据存储进行操作,即使进行谓词下推,相关列也必须从Cassandra/其他NoSQL存储中移动到Spark中才能运行查询。将已移动到Spark的数据缓存没有多大意义,因为自由查询确保下一次查询需要不同的数据集,这意味着再次重复该过程并导致Spark进程中的翻转,并抑制性能。
2> 如果只是将所有数据从数据存储加载到Spark中,则存在上述不新鲜问题,因为Spark是不可变缓存。解决办法之一是在Spark中设置TTL(生存时间)并定期从头开始删除和重新创建数据框架,这是浪费和低效的,而且在执行此操作时查询的结果不明确。

最佳解决方案(我知道的一个是SnappyData)将数据框转换为可变实体,以便在Spark中CDC NoSQL存储中的数据更改,并且可以使用Spark SQL执行查询,而无需离开Spark集群或每次查询时将数据移入Spark。这具有显着的性能优势(数据可以以列格式存储,可以修剪查询,可以避免不必要的序列化成本,在Spark中利用代码生成来更快地运行查询),减少了整个系统的复杂性,并允许您构建与最新数据一起工作的连续应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接