【问题标题】:Spark load csv file in jar from resources folderSpark从资源文件夹中加载jar中的csv文件
【发布时间】:2019-03-07 14:14:51
【问题描述】:

我正在尝试创建一个在 Scala 上运行的 Spark 应用程序,该应用程序读取位于 src/main/resources 目录中的 .csv 文件并将其保存在本地 hdfs 实例中。当我在本地运行它时,一切都很迷人,每当我将它捆绑为 .jar 文件并将其部署到服务器上时,就会出现问题......

这是我的代码,位于src/main/scala,我的数据文件的位置是src/main/resources/dataset.csv

val df = spark.read
  .format("csv")
  .option("header", "true")
  .option("inferSchema", "true")
  .load(getClass.getResource("dataset.csv").toString())

当我通过调用 sbt package 创建一个 jar 并将其部署到我的服务器时,我收到以下错误:

Exception in thread "main" java.lang.IllegalArgumentException: 
java.net.URISyntaxException: 
Relative path in absolute URI: jar:file:/root/./myapp_2.11-0.1.jar!/dataset.csv

如何正确链接到我的文件?

【问题讨论】:

标签: scala apache-spark


【解决方案1】:

在从getResource 返回的URL 对象上使用getPath() 以获取绝对路径:

getClass.getResource("data.csv").getPath()

像这样:

/upload-data-scala-project/target/scala-2.11/classes/data.csv

使用toString 将为您提供 URL 的字符串表示形式,例如:

file:/upload-data-scala-project/target/scala-2.11/classes/data.csv

没有前导斜杠,因此被解释为相对路径。

【讨论】:

  • @AndreVieiradeLima 我不确定为什么上述方法不起作用,但我遇到了同样的错误。我把它改成了getClass.getClassLoader.getResource(filename).getPath,它通过了。
【解决方案2】:

当您在资源中有路径并在集群中部署代码时,资源文件夹将根据您在代码部署设置中提供的配置路径位于某个位置 因此,您可以通过引用资源文件夹的完整路径来指定该文件

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案3】:

从错误消息看来,spark 需要一个绝对路径,而您提供的是文件的相对路径。我总是提供文件的绝对路径(如果文件在 HDFS 中,则为 hdfs://;如果文件在本地,则为 file://)。示例代码如下。

import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder.appName("My spark app").config("master","yarn").getOrCreate()
import spark.implicits._
val df = spark.read.json("hdfs:///user/amalprakash32203955/data/people.json")

【讨论】:

    猜你喜欢
    • 2012-03-10
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2014-10-11
    • 2011-12-18
    • 2020-05-27
    相关资源
    最近更新 更多