【问题标题】:Spark-Cassandra: how to efficiently restrict partitionsSpark-Cassandra:如何有效地限制分区
【发布时间】:2016-07-03 16:17:10
【问题描述】:

经过几天的思考,我仍然遇到这个问题:我有一张表,其中“时间戳”是分区键。该表包含数十亿行。

我还有“时间序列”表,其中包含与特定测量过程相关的时间戳。

我想用 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 的分区子集。

【问题讨论】:

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


    【解决方案1】:

    如果您在查询中添加“解释”调用,您将看到 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 连接器将获得来自timeseries 表读取的谓词,如果是集群键或分区键,则能够对其进行优化。见the Spark Cassandra Connector Docs。如果它不适合这些下推类别之一,则需要进行全表扫描,然后在 Spark 中进行过滤。

    由于Read Data From Table bigtable对此没有任何限制,Spark会指示Connector读取整个表(Full Table Scan)。

    【讨论】:

    • 感谢您的解释。我在某处读到(来自您的幻灯片?)连接器将扩展为“自动”执行joinwithcassandratablerepartitionbyrepllica,这仍然是计划吗?如果是这样,这是否意味着 Catalyst 也可以进行此类优化?
    • 反之亦然,Catalyst 必须首先支持它,然后我们才能真正使该功能成为 Dataframes 的稳定功能。查看issues.apache.org/jira/browse/SPARK-12449?filter=-3
    【解决方案2】:

    我只能猜测驱动程序所做的优化,但我肯定希望这样的查询会限制 WHERE 上的 JOIN,这意味着您的简单查询将得到优化。

    我还将为您指明优化 Spark SQL 的总体方向。查看用于 Spark SQL 的 Catalyst,它是一个极大优化查询到物理级别的工具。

    以下是其工作原理的细分: Deep Dive into Spark SQL Catalyst Optimizer

    以及 git-repo 的链接:Catalyst repo

    【讨论】:

      猜你喜欢
      • 2017-06-12
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 2018-04-22
      • 2021-11-21
      • 2022-08-11
      • 2019-06-02
      • 2013-12-29
      相关资源
      最近更新 更多