Scala Spark从resources文件夹在jar中加载csv文件
我正在尝试创建一个在Scala上运行的Spark应用程序,该应用程序读取位于Scala Spark从resources文件夹在jar中加载csv文件,scala,apache-spark,Scala,Apache Spark,我正在尝试创建一个在Scala上运行的Spark应用程序,该应用程序读取位于src/main/resources目录中的.csv文件,并将其保存在本地hdfs实例上。当我在本地运行它时,一切都很好,但每当我将它打包成.jar文件并部署到服务器上时,总会出现一些问题 这是位于src/main/scala中的我的代码,我的数据文件的位置是src/main/resources/dataset.csv: val df = spark.read .format("csv") .option("he
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
如何才能正确链接到我的文件?从错误消息中,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")
对从getResource
返回的URL
对象使用getPath()
获取绝对路径:
getClass.getResource(“data.csv”).getPath()
像这样:
/upload data scala project/target/scala-2.11/classes/data.csv
使用toString
将为您提供URL的字符串表示,如:
文件:/upload data scala project/target/scala-2.11/classes/data.csv
它没有前导斜杠,因此被解释为一个相对路径。您可以将csv文件存储在HDFS中,然后从Spark作业中读取,然后将其写回吗?这似乎是一个更好的设计,将数据从处理数据的应用程序中分离出来。在Thread中执行时,我收到的“21/02/24 10:53:27错误Thread.Client:应用程序诊断消息:用户类引发异常:java.lang.NullPointerException”可能重复。