SparkSQL技巧——如何识别SQL语句 和 执行一个SQL文件

前言

这是一个非常小的技巧,
但是应该还是有点用。

怎么在SparkSQL中写SQL?

  1. 如果我们直接使用,那么大概是如下这样:
    ss.sql("select * from xxxx")
    这种直接写的方式当然是非常简单,
    但是如果SQL很复杂的话,
    那么就不太好控制了,
    可读性也非常差

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


    image.png
  3. 选择Spark语言特性


    image.png
  4. 注入后的效果就如图了,这样就好看很多了
    但是编辑起来还是不太友好,


    image.png
  5. 于是我们可以这样


    image.png
  6. 这样编辑起来就方便多了,在下面编辑,上面也sql也会动态进行转换
    不过如果sql很复杂,一行看起来就显得很难阅读了。


    image.png
  7. 那么我们可以这样


    image.png
  8. 这样就可以将SQL语句进行分行处理了,不过SQL不支持这种 |,所以会有报错

    image.png

  9. 那么我们就去掉 |吧,最终效果就这样了

    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)
  }

那么我们来使用一下:

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} 存在

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值