在集群上运行作业时从本地资源中读取.sql文件



在spark/scala中使用以下命令读取我放在资源表中的长SQL查询

val stream = getClass.getResourceAsStream("wbs_element.sql")
val query = scala.io.Source.fromInputStream(stream).getLines.mkString

我希望它工作得很好,因为当我运行.assembly时,必须在编译时读取资源文件。但是,只有当我在本地编译/运行程序时,它才能正常工作。

在集群上,它给出以下错误:

User class threw exception: java.io.FileNotFoundException: src/main/resources/wbs_element.sql (No such file or directory)

我猜程序仍然没有在编译时读取.sql,它正在集群上寻找该文件,在运行时。你能告诉我我应该使用什么命令才能在编译时读取本地文件吗?

根据环境和部署应用程序的方式,可以在运行时读取多个选项,例如:

  • 如果你想在cluster部署模式下配置这个文件,你应该把它作为spark-submit命令的一部分,通过--files选项上传到驱动程序(和其他节点)
  • 如果您想在spark-submit中使用client模式,您可以将其作为本地文件访问(您的驱动程序将在您提交应用程序的机器上运行)

但是,如果您真的想在编译时读取文件并将SQL字符串编译到您的源代码中,我宁愿研究scala元编程/宏的方向。什么是一个简单的方法来定义一个字符串常量是一个文件的内容在编译时(在Scala)?

最新更新