从Uber Jar中的资源中将CSV文件作为数据框加载

问题描述 投票:0回答:1

因此,我制作了一个可在Spark中运行的Scala应用程序,并使用sbt>程序集创建了Uber Jar。

我加载的文件是应用程序所需的查找,因此,想法是将其打包在一起。它可以在InteliJ中使用“ src / main / resources / lookup01.csv”路径正常工作]

我正在Windows中进行开发,在本地进行测试,以将其部署到远程测试服务器之后。

但是当我在Windows计算机上调用spark-submit时,出现错误:

“ org.apache.spark.sql.AnalysisException:路径不存在:file:/ H:/dev/Spark/spark-2.4.3-bin-hadoop2.7/bin/src/main/resources/”] >

似乎它试图在sparkhome位置而不是从JAr文件内部查找文件。

我如何表达路径,以便它可以从JAR包中查找文件?

我加载数据框的方式的示例代码。加载后,我将其转换为其他结构,例如地图。

val v_lookup = sparkSession.read.option( "header", true ).csv( "src/main/resources/lookup01.csv")

[我想实现的是表达这种方式,使其在我尝试运行JAR的每个环境中都可以正常工作,理想情况下,在开发时也可以在InteliJ内部工作。

编辑:scala版本为2.11.12

更新:

似乎要在JAR内部获取文件,我必须以流的形式读取它,波纹管代码起作用了,但是我想不出一种安全的方法来提取文件的标题,例如SparkSession.read。选项具有。

val fileStream = scala.io.Source.getClass.getResourceAsStream("/lookup01.csv")
val inputDF = sparkSession.sparkContext.makeRDD(scala.io.Source.fromInputStream(fileStream).getLines().toList).toDF

当应用makeRDD时,我得到了RDD,然后可以将其转换为数据帧,但似乎我失去了使用“读取”中的选项将标头解析为模式的功能。

使用makeRDD时是否可以解决?

与此有关的另一个问题是,我似乎必须手动将行解析为列。

因此,我制作了一个Scala应用程序以在Spark中运行,并使用sbt>程序集创建了Uber Jar。我加载的文件是应用程序所需的查找,因此,想法是将其打包在一起。它可以工作...

scala apache-spark jar
1个回答
0
投票

您必须从classPath获取正确的路径

考虑到您的文件位于src / main / resources下:

© www.soinside.com 2019 - 2024. All rights reserved.