【问题标题】:Spark Truncated Spark Plan火花截断火花计划
【发布时间】:2021-07-06 22:31:19
【问题描述】:

我面临以下问题:打印执行计划时,我无法查看所有推送的过滤器。

执行的代码是

println(df.queryExecution.executedPlan.treeString(true))

所有的plan都打印出来了,在Pushed filter字段如下

 PushedFilters: [IsNotNull(X1), IsNotNull(X2), IsNotNull(X2), IsNotNull(X3..., ReadSchema: 

您可能会注意到,它并没有完全打印出来。此外,为了解决这个问题,我在 spark-default.conf 中修改了以下属性

spark.debug.maxToStringFields    120000

很遗憾,前面没有解决问题。

关于如何克服这个问题的任何建议?

【问题讨论】:

  • 你为什么不用df.explain(true)
  • df.explain(true) 也会截断计划

标签: scala apache-spark apache-spark-sql


【解决方案1】:

目前硬编码 [1, 2] 从 Spark 3.0.1 开始最多为 100 个字符,但最近它是 fixed,带有新引入的配置键 spark.sql.maxMetadataStringLength,默认为 100 .

【讨论】:

    【解决方案2】:

    你可以df.explain(true)它会输出整个计划:

    == Parsed Logical Plan ==
    'SerializeFromObject [validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true]), 0, x), IntegerType) AS x#67, validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true]), 1, y), IntegerType) AS y#68, validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true]), 2, z), IntegerType) AS z#69]
    +- 'MapElements <function1>, interface org.apache.spark.sql.Row, [StructField(x,IntegerType,false), StructField(y,IntegerType,false), StructField(z,IntegerType,false)], obj#66: org.apache.spark.sql.Row
       +- 'DeserializeToObject unresolveddeserializer(createexternalrow(getcolumnbyordinal(0, IntegerType), getcolumnbyordinal(1, IntegerType), getcolumnbyordinal(2, IntegerType), StructField(x,IntegerType,false), StructField(y,IntegerType,false), StructField(z,IntegerType,false))), obj#65: org.apache.spark.sql.Row
          +- Filter isnull(y#9)
             +- Filter (x#8 = 0)
                +- Project [_1#4 AS x#8, _2#5 AS y#9, _3#6 AS z#10]
                   +- SerializeFromObject [assertnotnull(assertnotnull(input[0, scala.Tuple3, true]))._1 AS _1#4, assertnotnull(assertnotnull(input[0, scala.Tuple3, true]))._2 AS _2#5, assertnotnull(assertnotnull(input[0, scala.Tuple3, true]))._3 AS _3#6]
                      +- ExternalRDD [obj#3]
    
    == Analyzed Logical Plan ==
    x: int, y: int, z: int
    SerializeFromObject [validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true]), 0, x), IntegerType) AS x#67, validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true]), 1, y), IntegerType) AS y#68, validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true]), 2, z), IntegerType) AS z#69]
    +- MapElements <function1>, interface org.apache.spark.sql.Row, [StructField(x,IntegerType,false), StructField(y,IntegerType,false), StructField(z,IntegerType,false)], obj#66: org.apache.spark.sql.Row
       +- DeserializeToObject createexternalrow(x#8, y#9, z#10, StructField(x,IntegerType,false), StructField(y,IntegerType,false), StructField(z,IntegerType,false)), obj#65: org.apache.spark.sql.Row
          +- Filter isnull(y#9)
             +- Filter (x#8 = 0)
                +- Project [_1#4 AS x#8, _2#5 AS y#9, _3#6 AS z#10]
                   +- SerializeFromObject [assertnotnull(assertnotnull(input[0, scala.Tuple3, true]))._1 AS _1#4, assertnotnull(assertnotnull(input[0, scala.Tuple3, true]))._2 AS _2#5, assertnotnull(assertnotnull(input[0, scala.Tuple3, true]))._3 AS _3#6]
                      +- ExternalRDD [obj#3]
    
    == Optimized Logical Plan ==
    SerializeFromObject [validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true]), 0, x), IntegerType) AS x#67, validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true]), 1, y), IntegerType) AS y#68, validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true]), 2, z), IntegerType) AS z#69]
    +- MapElements <function1>, interface org.apache.spark.sql.Row, [StructField(x,IntegerType,false), StructField(y,IntegerType,false), StructField(z,IntegerType,false)], obj#66: org.apache.spark.sql.Row
       +- DeserializeToObject createexternalrow(x#8, y#9, z#10, StructField(x,IntegerType,false), StructField(y,IntegerType,false), StructField(z,IntegerType,false)), obj#65: org.apache.spark.sql.Row
          +- LocalRelation <empty>, [x#8, y#9, z#10]
    
    == Physical Plan ==
    *(1) SerializeFromObject [validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true]), 0, x), IntegerType) AS x#67, validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true]), 1, y), IntegerType) AS y#68, validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true]), 2, z), IntegerType) AS z#69]
    +- *(1) MapElements <function1>, obj#66: org.apache.spark.sql.Row
       +- *(1) DeserializeToObject createexternalrow(x#8, y#9, z#10, StructField(x,IntegerType,false), StructField(y,IntegerType,false), StructField(z,IntegerType,false)), obj#65: org.apache.spark.sql.Row
          +- LocalTableScan <empty>, [x#8, y#9, z#10]
    

    【讨论】:

    • 因为它不会打印所有推送的过滤器。此外,在您的物理计划中,我没有看到推送过滤器。
    猜你喜欢
    • 2016-09-27
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 2017-04-27
    • 1970-01-01
    • 2016-10-20
    • 2023-03-26
    相关资源
    最近更新 更多