首页 > 解决方案 > Spark Sql - 运行两次

问题描述

我遇到了 ETL 流程的 spark 代码,在该代码中编写了长而复杂的 sql 语句并面临 oom 错误,有时单个作业需要 4 个小时才能多次执行相同的代码。

他们有很多这样的 etl 进程,我在这里粘贴了示例查询,其中包含带有嵌套和聚合、group by、ordr by 等的长复杂连接。顺便说一句,它仍然不是完整的查询

请查看以下查询,他们将其用作

SqlContext.sql(below query).write.mode(append).insertinto(hivetbl)

这是使用火花的正确方法吗?


SELECT 
    above 30 joins with aggregations

标签: apache-sparkapache-spark-sqlapache-spark-datasetapache-spark-2.0

解决方案


我也有同样的问题。Spark 通过运行带有空结果的用户查询来推断列的类型。(查看https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/jdbc/JdbcDialects.scala第 112 行,getSchemaQuery 函数)

像 (select ... from ...) 这样的简单查询,其中 1=0 会非常快,但是具有连接操作的查询会像连接操作一样慢。

也许您可以使用(https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html)“customSchema ”选项来防止火花推断您的结果类型。


推荐阅读