前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >SparkSQL技巧——如何识别SQL语句 和 执行一个SQL文件

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

作者头像
solve
发布于 2020-07-15 08:14:50
发布于 2020-07-15 08:14:50
2.7K00
代码可运行
举报
文章被收录于专栏:大数据技术栈大数据技术栈
运行总次数:0
代码可运行

前言

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

怎么在SparkSQL中写SQL?

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

image.png

  1. 选择Spark语言特性

image.png

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

image.png

  1. 于是我们可以这样

image.png

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

image.png

  1. 那么我们可以这样

image.png

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

image.png

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

image.png

好了上面这些技巧你掌握了吗? 那么还有没有更好的想法呢? 如果我们可以写一个SQL文件直接执行这个SQL文件, 那样不是更优雅吗?

在SparkSQL中执行一个SQL文件

SparkSQL好像没有提供相关的Api, 至少我是没有找到。 于是我自己写了一个.... 代码很简单, 如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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()
  }

那么我们来使用一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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} 存在

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验