Spark-Cassandra:如何有效地限制分区

时间:2016-03-17 10:55:08

标签: apache-spark cassandra pyspark apache-spark-sql spark-cassandra-connector

经过几天的考虑,我仍然坚持这个问题:我有一张桌子,其中"时间戳"是分区键。该表包含数十亿行。

我也有#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的分区子集。

2 个答案:

答案 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