Spark sql 查询优化

Posted

技术标签:

【中文标题】Spark sql 查询优化【英文标题】:Spark sql query optimization 【发布时间】:2019-02-12 10:12:04 【问题描述】:

我想在 spark 数据框中加载一个数据表。我的数据库中有 2 个表。是否需要写 2 次完整连接选项? 有什么办法可以写一次公共部分,然后多次更改变量表名。

table1 = spark.read\
.format("jdbc")\
.option("url","jdbc:oracle:thin:USER/Password@host:port/db_name")\
.option("driver","oracle.jdbc.driver.OracleDriver" )\
.option("dbtable","table_name_1")\
.load()


table2 = spark.read\
    .format("jdbc")\
    .option("url","jdbc:oracle:thin:USER/Password@host:port/db_name")\
    .option("driver","oracle.jdbc.driver.OracleDriver" )\
    .option("dbtable","table_name_2")\
    .load()

【问题讨论】:

【参考方案1】:

请在sn-p下面,希望对你有帮助。

def load_table_df(table_name):
    # You can define "jdbc:oracle:thin:USER/Password@host:port/db_name" as parameter too.
    return spark.read\
        .format("jdbc")\
        .option("url","jdbc:oracle:thin:USER/Password@host:port/db_name")\
        .option("driver","oracle.jdbc.driver.OracleDriver" )\
        .option("dbtable", table_name)\
        .load()

table1 = load_table_df('table_name_1')
table2 = load_table_df('table_name_2')

【讨论】:

谢谢,有什么方法可以在不使用函数调用的情况下做到这一点? 如果你想要 2 个数据框,你需要调用函数,我不知道没有函数调用的不同解决方案。但是函数调用有什么缺点吗? @DuyNguyenHoang 我认为多次调用函数或多次编写完整代码实际上是相同的(不考虑代码行数)。【参考方案2】:

您可以单独创建阅读器

reader = (spark.read
  .format("jdbc")
  .option("url","jdbc:oracle:thin:USER/Password@host:port/db_name")
  .option("driver","oracle.jdbc.driver.OracleDriver" ))

加载

table1 = reader.option("dbtable","table_name_1").load()
table2 = reader.option("dbtable","table_name_2").load()

【讨论】:

以上是关于Spark sql 查询优化的主要内容,如果未能解决你的问题,请参考以下文章

提效 7 倍,Apache Spark 自适应查询优化在网易的深度实践及改进

深入研究Spark SQL的Catalyst优化器(原创翻译)

提效7倍,Apache Spark 自适应查询优化在网易的深度实践及改进

自适应查询执行:在运行时提升Spark SQL执行性能

细数Spark3.0的那些新特性

Spark SQL项目中的优化思路