从资源文件夹中将jar中的csv文件火花加载

时间:2019-03-07 14:14:51

标签: scala apache-spark

我正在尝试创建一个在Scala上运行的Spark应用程序,该应用程序读取位于.csv目录中的src/main/resources文件并将其保存在本地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

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

3 个答案:

答案 0 :(得分:0)

它对我有用:

import spark.implicits._
val ds = spark.createDataset[String](Source.fromInputStream(
getClass.getResourceAsStream("/path/to/file")).getLines().toSeq)

val input = spark.read.format("csv")

更多示例,您可以找到here

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:-1)

从错误消息中看来,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")