因此,我制作了一个Scala应用程序在Spark中运行,并使用sbt>程序集创建了优步Jar。
我加载的文件是应用程序所需的查找,因此其思想是将其打包在一起。它在InteliJ内部使用路径"src/main/resources/lookup01.csv“工作得很好。
我正在Windows中进行开发,在将其部署到远程测试服务器之后进行本地测试。
但是,当我在Windows机器上调用submit时,我得到了错误:
“file:/H:/dev/Spark/spark-2.4.3-bin-hadoop2.7/bin/src/main/resources/”:org.apache.spark.sql.AnalysisException:路径不存在
它似乎试图在sparkhome位置而不是在JAr文件中找到该文件。
我如何表示路径,这样它才能从JAR包中查看文件?
加载Dataframe的方式的示例代码。加载之后,我将其转换为其他结构,如Maps。
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,然后可以将其转换为dataframe,但我似乎失去了使用"read“选项的能力,该选项将解析出标头作为模式。
在使用makeRDD时,有什么方法可以绕过它吗?
这方面的另一个问题似乎是,我必须手动将行解析为列。
发布于 2019-09-25 15:51:04
您必须从classPath获得正确的路径
考虑到您的文件位于src/main/resources下:
val path = getClass.getResource("/lookup01.csv")
val v_lookup = sparkSession.read.option( "header", true ).csv(path)发布于 2019-09-27 12:42:27
因此,所有这些都指向在JAR文件中之后,只能作为一个输入流访问它,以便从压缩文件中读取数据块。
我找到了一个解决方案,尽管它不是很好--它完成了我所需要的工作,即读取csv文件,获取第2列并使其成为一个dataframe,并在将其加载到键值结构中之后(在本例中,我创建了一个case类来保存这些对)。
我正在考虑将这些查找迁移到HOCON文件,这可能会减少加载这些查找的过程的复杂性。
import sparkSession.implicits._
val fileStream = scala.io.Source.getClass.getResourceAsStream("/lookup01.csv")
val input = sparkSession.sparkContext.makeRDD(scala.io.Source.fromInputStream(fileStream).getLines().toList).toDF()
val myRdd = input.map {
line =>
val col = utils.Utils.splitCSVString(line.getString(0))
KeyValue(col(0), col(1))
}
val myDF = myRdd.rdd.map(x => (x.key, x.value)).collectAsMap()
fileStream.close()https://stackoverflow.com/questions/58101701
复制相似问题