首页 文章

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

提问于
浏览
3

我有一个Spark Streaming进程实时填充Cassandra表 . 我想在该Cassandra表上进行查询,以便访问底层数据 .

CQL的语法非常有限(条件有限,没有分组),所以我想在它上面使用Spark SQL .

但是一旦我加载数据框,它就不会看到底层数据的任何变化 . 如何不断保持刷新数据帧,以便他们始终看到数据更改?

斯尔詹

1 回答

  • 1

    我知道这是一篇较老的帖子,但这里似乎有一个反复出现的主题 . 需要对已经被摄入NoSQL存储的数据进行全功能查询,而Spark SQL提供了这样做的能力 . 沿着那条路走下去需要考虑几件事情

    1>如果使用Spark连接器直接使用数据存储区,即使使用谓词下推,也必须将相关列从Cassandra /其他NoSQL存储移动到Spark中以运行查询 . 缓存已移入Spark的数据几乎没有意义,因为临时查询可确保下一个查询需要一组不同的数据,这意味着再次重复该过程并导致Spark过程中的流失,并抑制性能

    2>如果只是简单地将数据存储区中的所有数据加载到Spark中,那么就会出现上面提到的过时问题,因为Spark是一个不可变的缓存 . 一个解决方案是在Spark中的数据上设置一个TTL(生存时间),并且每隔一段时间从头开始重新创建数据帧,这是浪费和低效的,并且不清楚查询会发生什么DONE

    最好的解决方案(SnappyData是我所知道的)只是将数据帧转换为可变实体,因此可以在Spark中对NoSQL存储中的数据进行CDCed更改,并且可以使用Spark SQL执行查询,而无需离开Spark群集或具有为每个查询将数据移动到Spark . 这具有显着的性能优势(数据可以以列式格式存储,查询可以修剪,您可以避免不必要的序列化成本,利用Spark中的代码生成来更快地运行查询),降低整体系统复杂性并允许您构建连续的应用程序使用最新数据 .

相关问题