因此,我制作了一个可在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。我加载的文件是应用程序所需的查找,因此,想法是将其打包在一起。它可以工作...
您必须从classPath获取正确的路径
考虑到您的文件位于src / main / resources下: