首页 > 解决方案 > 查询在执行前挂起(查询计划需要很长时间)

问题描述

我正在尝试执行以下查询(在 Hive 表上),但由于某种原因,它甚至在开始执行之前就挂起。将其粘贴到 REPL 后就挂起,WEB UI 中也没有出现任何内容。

Spark shell 使用以下参数启动:

$ spark-shell --num-executors=10 --executor-cores=3 --executor-memory=16G --conf spark.sql.adaptive.enabled=true

testtable 有几条记录,而 testtable_stg 有大约 1 亿条记录。查询中有 15 列,我在这里只包括 6 列以简化它。

{
     {
       spark.table("testtable_stg")
         .selectExpr(
           """md5(concat(coalesce(nullif(test1,'null'),'val'),
             coalesce(nullif(test2,'null'),'val'),
             coalesce(nullif(test3,'null'),'val'),
             coalesce(nullif(test4,'null'),'val'),
             cast(coalesce(test5,'2222-22-22') as date),
           )) as sk""",
           "coalesce(nullif(test1,'null'),'val') as test1",
           "coalesce(nullif(test2,'null'),'val') as test2",
           "coalesce(nullif(test3,'null'),'val') as test3",
           "coalesce(nullif(test4,'null'),'val') as test4",
           "cast(coalesce(test5,'2222-22-22') as date) as test5",
           "CAST(from_unixtime(unix_timestamp()) AS TIMESTAMP) as dt"
         )
     }.join(spark.table("testtable"), Seq("sk"), "leftanti")
       .write
       .format("parquet")
       .mode("Append")
       .saveAsTable("testtable")
}

当我将其粘贴到 REPL 而不写入时,就可以了。但是,当我想对这个 df 调用任何操作(即显示、保存)甚至解释计划时,它就会冻结。

我想我最终会找到运行此查询的解决方案。但我对这里的 Spark 行为更感兴趣,它只是挂起。我在这个集群上运行了数千个查询。但通常我会得到一些信息(即警告、错误等)。但在这个特定的查询中,它只是挂起。

更新

我开始从select语句中一一删除列,最后得到了查询计划。更少的列,查询计划的生成速度更快。但是,对于所有列,它需要很长时间,因为在执行查询之前似乎已经生成了很长时间的查询计划。有什么办法可以加快速度吗?我试图增加驱动程序的内存,但没有运气。我正在使用火花 2.1 和 2.2。

标签: apache-sparkhiveapache-spark-sql

解决方案


推荐阅读