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

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

作者头像
solve
发布2020-07-15 16:14:50
2.5K0
发布2020-07-15 16:14:50
举报
文章被收录于专栏:大数据技术栈大数据技术栈

前言

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

怎么在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
复制
 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
复制
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 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 怎么在SparkSQL中写SQL?
  • 在SparkSQL中执行一个SQL文件
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档