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优化器(原创翻译)