我正在开发“大数据实时渲染(空间数据)”的应用程序。 在Spark Streaming + Spark SQL + WebSocket的帮助下,我能够在仪表板上呈现预定义的查询。但我想通过交互式查询和即席查询来获取数据。
为此,我试图用“Spark Streaming + Cassandra”实现它。这些查询需要聚合并过滤大量数据。
我是Cassandra和Spark的新手,所以我对下面的方法很困惑,这会更好\更快:
Cassandra会快到足以实时提供结果吗?或者我应该从Cassandra创建一个RDD来对其执行交互式查询。
其中一个问题是:
"SELECT * FROM PERFORMANCE.GEONAMES A INNER JOIN
(SELECT max(GEONAMEID) AS MAPINFO_ID FROM PERFORMANCE.GEONAMES
where longitude between %LL_LONG% and %UR_LONG%
and latitude between %LL_LAT% and %UR_LAT%
and %WHERE_CLAUSE% GROUP BY LEFT(QUADKEY, %QUAD_TREE_LEVEL%) )
AS B ON A.GEONAMEID = B.MAPINFO_ID"
任何意见或建议将不胜感激。谢谢,
感谢@doanduyhai建议SASI二级指数,它确实产生了巨大的差异。
答案 0 :(得分:2)
Cassandra会快到足以实时提供结果吗?或者我应该从Cassandra创建一个RDD来对其执行交互式查询。
这取决于您预先做了多少过滤以及群集中的计算机数量。如果你的Cassandra表有1Tb的数据并且你在内存中查询100Gb的数据,假设有10台机器的集群,这意味着在内存中加载1Gb它是可管理的,但查询永远不会是分钟。
现在,如果你进行过滤足以从Cassandra表中仅获取100Mb,那么它意味着10Mb /机器,并且可能有几秒钟的延迟。
如何在Cassandra早期过滤数据?
答案 1 :(得分:1)
哪个更好\更快
一如既往,取决于您希望能够运行哪种查询。 Cassandra根据您设置表格的方式施加了一些限制;例如,您不能在where
子句中使用非索引列。如果使用Spark inbetween加载数据,则可以执行Spark允许的任何查询。
如果您使用SparkSQL / DataFrames,并执行Cassandra does
允许的查询,Spark会将其推下并获得与直接使用Cassandra类似的性能。否则,它必须从Cassandra加载所有数据,然后应用你指定的任何过滤器,这显然效率低得多。
总的来说,你可以使用Spark,但它允许用户运行非常慢的查询。因此,您仍应了解如何在Cassandra中构建数据,以增加谓词下推原始Cassandra性能的可能性。