在 Spark 上执行多个 SQL 查询

2024-03-02

我在文件 test.sql 中有一个 Spark SQL 查询 -

CREATE GLOBAL TEMPORARY VIEW VIEW_1 AS select a,b from abc

CREATE GLOBAL TEMPORARY VIEW VIEW_2 AS select a,b from VIEW_1

select * from VIEW_2

现在,我启动我的 Spark-Shell 并尝试像这样执行它 -

val sql = scala.io.Source.fromFile("test.sql").mkString
spark.sql(sql).show

此操作失败并出现以下错误 -

org.apache.spark.sql.catalyst.parser.ParseException:
mismatched input '<' expecting {<EOF>, 'GROUP', 'ORDER', 'HAVING', 'LIMIT', 'OR', 'AND', 'WINDOW', 'UNION', 'EXCEPT', 'MINUS', 'INTERSECT', 'SORT', 'CLUSTER', 'DISTRIBUTE'}(line 1, pos 128)

我尝试在不同的 Spark.sql 语句中一一执行这些查询,并且运行良好。问题是,我有 6-7 个创建临时视图的查询,最后我需要最后一个视图的输出。有没有一种方法可以让我在单个 Spark.sql 语句中运行这些 SQL。我曾研究过 Postgres SQL (Redshift),它能够执行此类查询。在 Spark sql 中,在这种情况下我将不得不维护很多文件。


问题是mkString将所有行连接到一个字符串中,该字符串无法正确解析为有效的 SQL 查询。

脚本文件中的每一行都应作为单独的查询执行,例如:

scala.io.Source.fromFile("test.sql").getLines()
  .filterNot(_.isEmpty)  // filter out empty lines
  .foreach(query =>
    spark.sql(query).show
  )

Update

如果查询被拆分为多行,则情况会稍微复杂一些。

我们绝对需要一个标记查询结束的标记。让它成为分号字符,就像标准 SQL 中一样。

首先,我们从源文件中收集所有非空行:

val lines = scala.io.Source.fromFile(sqlFile).getLines().filterNot(_.isEmpty)

然后我们处理收集到的行,将每个新行与前一行连接起来(如果它不以分号结尾):

val queries = lines.foldLeft(List[String]()) { case(queries, line) =>
  queries match {
    case Nil => List(line) // case for the very first line
    case init :+ last =>
      if (last.endsWith(";")) {
        // if a query ended on a previous line, we simply append the new line to the list of queries
        queries :+ line.trim
      } else {
        // the query is not terminated yet, concatenate the line with the previous one
        val queryWithNextLine = last + " " + line.trim
        init :+ queryWithNextLine
      }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spark 上执行多个 SQL 查询 的相关文章

随机推荐

  • 无法检测adb版本,退出值:0xc0000135

    我使用的android studio最新版本 HEXM 已安装在我的电脑中 android虚拟设备未创建其显示未知问题 好的 所以我使用 genymotion 模拟器 但 android studio 没有检测到它 无法检测adb版本 退出
  • 标题中单个单词的颜色与组的颜色相匹配

    我最近在 经济学人 上看到了一张折线图 其中标题包含彩色单词以匹配折线图中使用的组的颜色 https www economist com blogs graphicdetail 2018 04 daily chart 1 我想知道如何使用
  • Golang SQL 查询变量替换

    我有 sql 查询需要变量替换才能更好地消耗我的go kit https github com go kit kit服务 I have dep org作为我的休息服务一部分的用户输入 例如 dep abc and org def 我尝试过一
  • “未捕获的引用错误:JQueryValidatorUI 未定义”?

    使用 jquery validation ui 插件时 未捕获的 ReferenceError JQueryValidatorUI 未定义 也未捕获类型错误 对象 对象对象 没有方法 验证 这是我的脚本顺序
  • 如何在JUNG中添加具有相同标签(但端点不同)的两条边?

    如何添加具有相同标签但端点不同的两条边 例如 我想添加两条具有相同标签 label1 的边 一条从顶点 v 1 到顶点 v 2 另一条从顶点 v 2 到 v 3 部分代码是 g addEdge label1 v 1 v 2 g addEdg
  • 如何将 javascript 对象发送到远程 CFC 组件

    我创建了一个 javascript 对象 var spanglist one q1 two q2 three q3 four q4 我创建 ajax jquery 对象以将数据发送到 CFC ajax url gridly componen
  • Angularjs:ReferenceError:范围未定义

    我是 Angularjs 的初学者 在理解模块和范围方面有一些困难 我不断收到范围未定义的错误 但我不明白为什么 首先 我将控制器链接到设置路线的位置 但由于控制器内的函数是在提交按钮上调用的 因此单击我将其拿走 我试过把它放回去 但这没有
  • pytest从不同的测试文件独立导入相同的模块

    以下主题模块包含两个函数 其中之一操作全局变量 mod py def global setter global x x 123 print setter x x def global getter print getter x x 每个功能
  • 如何在magento的成功页面中动态集成JS代码

    我知道 success phtml 是我应该放置我想要执行的代码的文件 但是我从 CJ 收到这个文件 它不是 html 而是一个 php 类 问题很简单 我想知道如何在收到订单后将此文件集成到 success phtml 中 谢谢 clas
  • np.ndarray`“is”中的奇怪行为

    is 内置运算符显示元素的奇怪行为np ndarray 尽管右侧和左侧的 id 相同 但 is 运算符返回 False 此行为特定于np ndarray a np array 1 b a view print id a 0 id b 0 T
  • postgres 使用 join 更新

    我正在尝试使用 ht 中的数据更新表 tr 两者都有几乎相同的列 所以为了测试我运行了这个查询 SELECT FROM tr a RIGHT OUTER JOIN ht b USING date name ft WHERE ft IS NO
  • 判断设备是否有触摸屏

    我的应用程序可以在标准手机上运行 但它也可以在 Android 播放器上运行 我通过 HDMI 将其连接到电视并使用鼠标进行导航 有没有办法以编程方式确定设备是否支持触摸屏 以便我可以区分两种导航方式 I tried this http d
  • 从项目 azure devops REST API 获取所有工作项

    我正在使用 Azure Devops API 通过 AWS Lambda node js 创建通知机器人 此时 我需要检查每个任务工作项是否附加到父用户故事 第一步是获取 给定 项目上的所有任务工作项 对于这一步 我正在阅读 azure d
  • 最坏情况时间复杂度分析伪代码

    有人可以帮我分析这个伪代码的时间复杂度吗 我正在寻找最坏情况的复杂度 但我无法弄清楚它是 O n 4 O n 5 还是完全其他的东西 如果您能详细说明您是如何解决这个问题的 我们将不胜感激 sum 0 for i 1 to n do for
  • 在构造函数中创建一个指针,指向 C++ 中类的实例

    我对这些 C 指针有点困惑 我想知道是否可以在构造函数内创建一个指向类实例的指针 以下行中的内容 class Room public Room Room private Room ptrToSelf Room Room ptrToSelf
  • zeppelin hive 解释器抛出 ClassNotFoundException

    我已经部署了zeppelin 0 6并在Jdbc解释器下配置了hive 尝试执行 hive show databases Throws org apache hive jdbc HiveDriver 类 java lang ClassNot
  • 如何访问封装在类中的未命名“枚举类”?

    class A public enum class HELLO WORLD 众所周知 在一个class 声明一个简单的enum 而不是enum class 是一个更好的主意 因为它已经用class鉴别 但上面的说法仍然是有效的C 0x签名
  • 将字符串写入文本文件

    我正在将日志保存到 SD 卡上的 txt 文件中 但是一旦保存了两行 它就会覆盖它并重新开始 这是我的代码 public static String getTimestamp try SimpleDateFormat dateFormat
  • 从Python中的一行中提取特定的子字符串

    我有一个包含多行格式的文件 格式如下 DIV ID 0X78800009 EXT LOS ANGELES TY STANDARD OWN 0X74400002 ABBR LA 我需要提取 EXT 值 但只提取引号中的部分 我目前正在使用这个
  • 在 Spark 上执行多个 SQL 查询

    我在文件 test sql 中有一个 Spark SQL 查询 CREATE GLOBAL TEMPORARY VIEW VIEW 1 AS select a b from abc CREATE GLOBAL TEMPORARY VIEW