hadoop java.net.URISyntaxException:绝对URI中的相对路径

vbkedwbf  于 7个月前  发布在  Hadoop
关注(0)|答案(1)|浏览(85)

我需要读取一个存储在项目资源中的文件,目录是src/main/resources/dataset/dataset.dat。我使用以下几行Scala代码从HDFS读取一个文本文件,并解析为数据集对象的Spark RDD:

// init Spark context
val conf: SparkConf = new SparkConf().setAppName("mydataset").setMaster("local")
val sc: SparkContext = new SparkContext(conf)

// read dat file
val resource = this.getClass.getClassLoader.getResource("dataset/dataset.dat")
val dsRdd: RDD[DatasetObject] = sc.textFile(resource.toString(), 1).map(line => DatasetData.parse(line))

字符串
出现以下错误:

class java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: jar:file:/grader/grader.jar!/dataset/dataset.dat
java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: jar:file:/grader/grader.jar!/dataset/dataset.dat


我尝试以另一种方式读取文件,但错误不断发生:

val dsRdd: RDD[DatasetObject] = sc.textFile("src/main/resources/dataset/dataset.dat").map(line => DatasetData.parse(line))

    • 重要提示:**单元测试在本地成功运行,问题发生在远程测试环境。
muk1a3rh

muk1a3rh1#

问题是使用getResourcetextFile,我不得不使用getResourceAsStreamsc.parallelize的组合,如下所示:

def lines: List[String] = {
    Option(getClass.getResourceAsStream("/dataset/dataset.dat")) match {
      case None => sys.error("Please download the dataset as explained in the assignment instructions")
      case Some(resource) => Source.fromInputStream(resource).getLines().toList
    }
  }

字符串
并解析为数据集对象的Spark RDD

val dsRdd: RDD[DatasetObject] = sc.parallelize(lines).map(line => DatasetData.parse(line))

相关问题