我正在尝试创建一个在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
如何正确链接到我的文件?
答案 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")