经过几天的考虑,我仍然坚持这个问题:我有一张桌子,其中"时间戳"是分区键。该表包含数十亿行。
我也有#34; timeseries"包含与特定测量过程相关的时间戳的表。
使用Spark我想分析大表的内容。当然,进行全表扫描效率不高,而且在时间序列表中查找速度相当快,我应该只能定位10k分区。
实现这一目标的最有效方法是什么?
SparkSQL是否足够智能以优化此类
sqlContext.sql("""
SELECT timeseries.timestamp, bigtable.value1 FROM timeseries
JOIN bigtable ON bigtable.timestamp = timeseries.timestamp
WHERE timeseries.parameter = 'xyz'
""")
理想情况下,我希望Cassandra从timeseries
表中获取时间戳,然后使用它来仅查询来自bigtable
的分区子集。
答案 0 :(得分:2)
如果您向查询添加“解释”调用,您将看到Catalyst计划程序将为您的查询执行的操作,但我知道它不会执行您想要的优化。
目前,Catalyst不支持将联接推送到DataSources,这意味着您的查询结构很可能看起来像。
Read Data From Table timeseries with predicate parameter = 'xyz'
Read Data From Table bigtable
Join these two results
Filter on bigtable.timestamp == timeseries.timestamp
Spark Cassandra Connector将从timeseries
表中读取谓词,如果是集群密钥或分区密钥,则可以对其进行优化。见the Spark Cassandra Connector Docs。如果它不适合其中一个下推类别,则需要全表扫描,然后在Spark中使用过滤器。
由于表bigtable
中的读数据没有限制,因此Spark会指示连接器读取整个表(全表扫描)。
答案 1 :(得分:1)
我只能猜测驱动程序所做的优化,但我肯定希望有一个查询来限制WHERE上的JOIN,这意味着你的简单查询将得到优化。
我将做的是指向优化Spark SQL的大方向。查看Spark SQL的 Catalyst ,它是极大地优化查询一直到物理层的工具。
以下是其工作原理的细分: resulting manifest
指向git-repo的链接:Deep Dive into Spark SQL Catalyst Optimizer