gpt4 book ai didi

apache-spark - 我们可以将 Spark 的 CBO(基于成本的优化器)与原生 Parquet 或内存数据帧结合使用吗?

转载 作者:行者123 更新时间:2023-12-01 05:50:16 24 4
gpt4 key购买 nike

假设我想加入 3 个表 A、B、C,内部连接和 C 非常小。

#DUMMY EXAMPLE with IN-MEMORY table, but same issue if load table using spark.read.parquet("")
var A = (1 to 1000000).toSeq.toDF("A")
var B = (1 to 1000000).toSeq.toDF("B")
var C = (1 to 10).toSeq.toDF("C")

而且我无法控制加入给我的顺序:
CASE1 = A.join(B,expr("A=B"),"inner").join(C,expr("A=C"),"inner")
CASE2 = A.join(C,expr("A=C"),"inner").join(B,expr("A=B"),"inner")

运行两者显示 CASE1 的运行速度比 CASE2 慢 30-40%。

所以问题是:如何利用 Spark 的 CBO 自动将 CASE1 转换为 CASE2,用于内存表或从 Spark 的 parquet 读取器加载的表?

我试过这样做:
spark.conf.set("spark.sql.autoBroadcastJoinThreshold", -1)
spark.conf.set("spark.sql.cbo.enabled", "true")
A.createOrReplaceTempView("A")
spark.sql("ANALYZE TABLE A COMPUTE STATISTICS")

但这会抛出:
org.apache.spark.sql.catalyst.analysis.NoSuchTableException: Table or view 'a' not found in database 'default'

有没有其他方法可以激活 CBO 而不必将表保存在 Hive 中?

附件:
  • 即使使用 spark.conf.set("spark.sql.cbo.enabled", "true"),SparkWebUI 中也没有显示成本估算
  • 显示 CASE1.explain != CASE2.explain

  • CASE1.解释
    == Physical Plan ==
    *(5) SortMergeJoin [A#3], [C#13], Inner
    :- *(3) SortMergeJoin [A#3], [B#8], Inner
    : :- *(1) Sort [A#3 ASC NULLS FIRST], false, 0
    : : +- Exchange hashpartitioning(A#3, 200)
    : : +- LocalTableScan [A#3]
    : +- *(2) Sort [B#8 ASC NULLS FIRST], false, 0
    : +- Exchange hashpartitioning(B#8, 200)
    : +- LocalTableScan [B#8]
    +- *(4) Sort [C#13 ASC NULLS FIRST], false, 0
    +- Exchange hashpartitioning(C#13, 200)
    +- LocalTableScan [C#13]

    CASE2.解释
    == Physical Plan ==
    *(5) SortMergeJoin [A#3], [B#8], Inner
    :- *(3) SortMergeJoin [A#3], [C#13], Inner
    : :- *(1) Sort [A#3 ASC NULLS FIRST], false, 0
    : : +- Exchange hashpartitioning(A#3, 200)
    : : +- LocalTableScan [A#3]
    : +- *(2) Sort [C#13 ASC NULLS FIRST], false, 0
    : +- Exchange hashpartitioning(C#13, 200)
    : +- LocalTableScan [C#13]
    +- *(4) Sort [B#8 ASC NULLS FIRST], false, 0
    +- Exchange hashpartitioning(B#8, 200)
    +- LocalTableScan [B#8]

    最佳答案

    不,简短的回答是这是不可能的。

    https://databricks.com/blog/2017/08/31/cost-based-optimizer-in-apache-spark-2-2.html提供了有关持久数据存储的可能性和要点的出色概述。

    关于apache-spark - 我们可以将 Spark 的 CBO(基于成本的优化器)与原生 Parquet 或内存数据帧结合使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55213505/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com