如何在sbt/apacheflink项目中打开资源文件夹中的文件

mtb9vblg  于 2021-06-21  发布在  Flink
关注(0)|答案(1)|浏览(439)

我正在使用ApacheFlink进行一个基于scala的项目,到目前为止,我只从内部运行我的项目 IntelliJ ,没有任何问题。现在我是第一次创建jar文件,然后由apacheflink运行时执行,打开资源文件时遇到了一些问题。
在启动时,一个名为 setup.xml 从内部 src/main/resources 就要开张了。这种方法很有效 IntelliJ ,但不是在flink运行时。
IntelliJ ,文件夹结构如下:

root
\
 src
   \
    main
     \
      resources
       \
        setup.xml

当使用某个存档资源管理器查看创建的jar文件时,结构如下所示:

root
\
 [...]
\
 setup.xml

我尝试过的代码变体:

// by path
val filePath = getClass.getResource("/setup.xml").getPath
val currentPath = Paths.get(filePath)
val parsed = XML.loadFile(currentPath.toString)

// by URI
val filePath = getClass.getResource("/setup.xml").toURI
val currentPath = Paths.get(filePath)
val parsed = XML.loadFile(currentPath.toString)

// with classloader
val filePath = getClass.getClassLoader.getResource("setup.xml").toURI
val currentPath = Paths.get(filePath)
val parsed = XML.loadFile(currentPath.toString)

所有3个变体都适用于 IntelliJ ,但不是flink运行时。它会给你 java.nio.file.FileSystemNotFoundException 或者 java.io.FileNotFoundException .
请注意,以下两种方法都适用 IntelliJ 以及flink运行时:

val source = Source.fromURL(getClass.getResource("/setup.xml"))
val parsed = XML.loadString(source.getLines().mkString)

但是,我必须能够访问路径组件,并使用组合/解析路径。这是因为xml文件将包含指向其他文件的链接,这些链接是相对于 setup.xml 文件本身。因此,我需要得到 setup.xml ,并下定决心 some-referenced.xml 用这个文件路径打开它。
那么,在使用 Path 类,这样我就可以动态解析这两个类中的其他文件路径 IntelliJ 以及flink运行时?

6g8kf2rb

6g8kf2rb1#

下面是一个读取我在以前项目中使用的csv文件的示例:

private val irisDS = env.readCsvFile[Iris](getClass.getResource("/iris.dat").getPath) map { tuple ⇒
    val list = tuple.productIterator.toList
    val numList = list map (_.asInstanceOf[Double])
    LabeledVector(numList(4), DenseVector(numList.take(4).toArray))
}

也许您在sbt中错误地声明了flink依赖项,我有这样的声明:

val flinkDependencies = Seq(
  "org.apache.flink" %% "flink-scala" % flinkVersion % "compile",
  "org.apache.flink" %% "flink-ml" % flinkVersion % "compile",
  "org.apache.flink" %% "flink-streaming-scala"  % flinkVersion  % "compile"
)

尽管如此,我认为当我在ApacheFlink运行时上执行项目时,我必须从外部读取文件,而不是从resources文件夹,也许我的setup.scala文件可以帮助您。

相关问题