首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将CSV文件作为数据从Uber Jar中的资源中加载

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

Stack Overflow用户
提问于 2019-09-25 15:17:30
回答 2查看 2.6K关注 0票数 3

因此,我制作了一个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。

代码语言:javascript
复制
val v_lookup = sparkSession.read.option( "header", true ).csv( "src/main/resources/lookup01.csv")

我想要实现的是以同样的方式来表达路径,这样它就可以在我尝试运行JAR的每个环境中工作,在开发过程中也可以在InteliJ内部工作。

编辑: scala版本是2.11.12

更新:

似乎要想在JAR中得到文件的帮助,我必须将它作为流来读取,下面的代码可以工作,但我无法找到像SparkSession.read.option那样安全地提取文件头的方法。

代码语言:javascript
复制
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时,有什么方法可以绕过它吗?

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

EN

回答 2

Stack Overflow用户

发布于 2019-09-25 15:51:04

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

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

代码语言:javascript
复制
val path = getClass.getResource("/lookup01.csv")

val v_lookup = sparkSession.read.option( "header", true ).csv(path)
票数 1
EN

Stack Overflow用户

发布于 2019-09-27 12:42:27

因此,所有这些都指向在JAR文件中之后,只能作为一个输入流访问它,以便从压缩文件中读取数据块。

我找到了一个解决方案,尽管它不是很好--它完成了我所需要的工作,即读取csv文件,获取第2列并使其成为一个dataframe,并在将其加载到键值结构中之后(在本例中,我创建了一个case类来保存这些对)。

我正在考虑将这些查找迁移到HOCON文件,这可能会减少加载这些查找的过程的复杂性。

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58101701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档