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

标签 scala apache-spark jar

因此,我制作了一个在 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 包中查找文件?

我加载 Dataframe 的方式的示例代码。加载后,我将其转换为其他结构,如 map 。

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

我想要实现的是获得表达路径的方式,以便它在我尝试运行 JAR 的每个环境中工作,理想情况下在开发时也可以在 InteliJ 中工作。

编辑:scala 版本为 2.11.12

更新:

似乎要了解 JAR 中的文件,我必须将其作为流读取,下面的代码有效,但我无法找到一种安全的方法来提取文件的 header ,例如 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,然后可以将其转换为数据帧,但似乎我失去了使用“读取”中的选项将 header 解析为模式的能力。

使用 makeRDD 时有什么解决方法吗?

另一个问题是我似乎必须手动将行解析为列。

最佳答案

你必须从classPath中得到正确的路径

考虑到你的文件在 src/main/resources 下:

val path = getClass.getResource("/lookup01.csv")

val v_lookup = sparkSession.read.option( "header", true ).csv(path)

关于scala - 从 Uber Jar 中的资源加载 CSV 文件作为数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58101701/

相关文章:

scala - 我可以将 'nesting' 与 Scala 抽象类型一起使用来简化类定义吗?

scala - spark - select 中的条件语句

apache-spark - Oozie shell 操作为 Spark 作业抛出 NullPointerException

jar - 使用 CXF wsdl2java 将 wsdl 捆绑在 jar 中

java - 如何取消对 jar 的签名?

scala - UnsatisfiedLinkError with native library under sbt

scala - 如何测试向另一个 Actor 发送消息的 Akka Actor ?

java - 谁执行 HBase 过滤器?

python - 如何从 pyspark 删除数据帧来管理内存?

java - 可执行 JAR 文件不显示资源