天天看点

SparkSQL技巧——如何识别SQL语句 和 执行一个SQL文件前言怎么在SparkSQL中写SQL?在SparkSQL中执行一个SQL文件

前言

这是一个非常小的技巧,

但是应该还是有点用。

怎么在SparkSQL中写SQL?

  1. 如果我们直接使用,那么大概是如下这样:

    ss.sql("select * from xxxx")

    这种直接写的方式当然是非常简单,

    但是如果SQL很复杂的话,

    那么就不太好控制了,

    可读性也非常差

  2. 通过IDEA注入语言特性

    通过如下方式,我们可以将SQL语言注入SQL的特性

SparkSQL技巧——如何识别SQL语句 和 执行一个SQL文件前言怎么在SparkSQL中写SQL?在SparkSQL中执行一个SQL文件

image.png

  1. 选择Spark语言特性
SparkSQL技巧——如何识别SQL语句 和 执行一个SQL文件前言怎么在SparkSQL中写SQL?在SparkSQL中执行一个SQL文件

image.png

  1. 注入后的效果就如图了,这样就好看很多了

    但是编辑起来还是不太友好,

SparkSQL技巧——如何识别SQL语句 和 执行一个SQL文件前言怎么在SparkSQL中写SQL?在SparkSQL中执行一个SQL文件

image.png

  1. 于是我们可以这样
SparkSQL技巧——如何识别SQL语句 和 执行一个SQL文件前言怎么在SparkSQL中写SQL?在SparkSQL中执行一个SQL文件

image.png

  1. 这样编辑起来就方便多了,在下面编辑,上面也sql也会动态进行转换

    不过如果sql很复杂,一行看起来就显得很难阅读了。

SparkSQL技巧——如何识别SQL语句 和 执行一个SQL文件前言怎么在SparkSQL中写SQL?在SparkSQL中执行一个SQL文件

image.png

  1. 那么我们可以这样
SparkSQL技巧——如何识别SQL语句 和 执行一个SQL文件前言怎么在SparkSQL中写SQL?在SparkSQL中执行一个SQL文件

image.png

  1. 这样就可以将SQL语句进行分行处理了,不过SQL不支持这种

    |

    ,所以会有报错
SparkSQL技巧——如何识别SQL语句 和 执行一个SQL文件前言怎么在SparkSQL中写SQL?在SparkSQL中执行一个SQL文件

image.png

  1. 那么我们就去掉

    |

    吧,最终效果就这样了
SparkSQL技巧——如何识别SQL语句 和 执行一个SQL文件前言怎么在SparkSQL中写SQL?在SparkSQL中执行一个SQL文件

image.png

好了上面这些技巧你掌握了吗?

那么还有没有更好的想法呢?

如果我们可以写一个SQL文件直接执行这个SQL文件,

那样不是更优雅吗?

在SparkSQL中执行一个SQL文件

SparkSQL好像没有提供相关的Api,

至少我是没有找到。

于是我自己写了一个....

代码很简单,

如下:

def getSQL(fileName: String, fields: (String, String)*)(): String = {
   //我们将SQL文件放在Redsource目录下
    val stream = this.getClass.getClassLoader.getResourceAsStream(fileName)
    val buff: BufferedSource = Source.fromInputStream(stream)
    //读取拼装SQL
    val sql = buff
      .getLines()
      .mkString("\n")
   // 自定义属性注入
    StringUtils.replaceEach(sql
      , fields.map("${" + _._1 + "}").toArray
      , fields.map(_._2).toArray).trim()
  }           

复制

那么我们来使用一下:

val myDF = spark.sql(
val sql = getSQL("test.sql", ("date", "20200713"), ("field1", "hello"))
)
myDF .show()           

复制

这样我们就简单的将SQL文件 test 执行起来了,

并且自己注入了属性

date="20200713"

"field1"="hello"

注入的SQL的属性在SQL文件中以

${date}

${field1}

存在