前言
这是一个非常小的技巧,
但是应该还是有点用。
怎么在SparkSQL中写SQL?
- 如果我们直接使用,那么大概是如下这样:
ss.sql("select * from xxxx")
这种直接写的方式当然是非常简单,
但是如果SQL很复杂的话,
那么就不太好控制了,
可读性也非常差
-
通过IDEA注入语言特性
通过如下方式,我们可以将SQL语言注入SQL的特性
image.png
- 选择Spark语言特性
image.png
-
注入后的效果就如图了,这样就好看很多了
但是编辑起来还是不太友好,
image.png
- 于是我们可以这样
image.png
-
这样编辑起来就方便多了,在下面编辑,上面也sql也会动态进行转换
不过如果sql很复杂,一行看起来就显得很难阅读了。
image.png
- 那么我们可以这样
image.png
- 这样就可以将SQL语句进行分行处理了,不过SQL不支持这种
,所以会有报错|
image.png
- 那么我们就去掉
吧,最终效果就这样了|
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}
存在