【发布时间】:2020-01-25 20:11:23
【问题描述】:
所以,我制作了一个在 Spark 中运行的 Scala 应用程序,并使用 sbt> 程序集创建了 Uber Jar。
我加载的文件是应用程序需要的查找,因此想法是将它打包在一起。它在 InteliJ 中使用路径“src/main/resources/lookup01.csv”运行良好
我正在 Windows 中进行开发,在本地进行测试,然后将其部署到远程测试服务器。
但是当我在 Windows 机器上调用 spark-submit 时,我得到了错误:
“org.apache.spark.sql.AnalysisException:路径不存在:文件:/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 .option 有。
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 apache-spark jar