apache-spark - 查询在执行前挂起(查询计划需要很长时间)
问题描述
我正在尝试执行以下查询(在 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。
解决方案
推荐阅读
- python - pyspark 在数据框中删除行以在一列中只有 X 个不同的值
- nginx - nginx docker 容器无法读取 certbot 证书
- r - 如何交叉制表跨同一字段的汇总值
- sh - 将变量分配给 shell 脚本中的每一行并稍后使用它们
- c# - .NET Core API 使用多个身份验证方案的问题
- c# - 将 avalonia 应用程序与某个自定义扩展名相关联,并在双击或使用 osX 中 finder 中的选项打开时处理文件
- autodesk-forge - 为什么更新的伪造查看器的模型浏览器隔离项目而不是选择?
- javascript - 如何防止用户输入重复的电子邮件?
- reactjs - styled-components:使用额外的样式扩展现有组件
- java - Can't import "import com.google.firebase.firestore.MetadataChanges" 原来的问题仍然没有答案