欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spark读取本地文件以及读取HDFS文件系统上的文件

程序员文章站 2022-05-01 10:09:55
...

使用Spark读取HDFS文件时没有什么问题,只要把读取的路径设置为HDFS文件系统中文件的位置即可,可是在读取本地文件时(比如读取E:/file/user.json,E盘中的user.json文件时却总是报错)。

先展示正确的操作方法,

import org.apache.spark.sql.{SQLContext, SparkSession}
object ReadJson {  //Spark SQL读取json文件
  def main(args: Array[String]): Unit = {
    val sparkSession = SparkSession.builder()
      .appName("ReadJson")
      .master("local").getOrCreate()

    import sparkSession.implicits._
	val data = sparkSession.read.json("file:///E:/file/user.json")
    data.show()
  }
}

Spark读取本地文件以及读取HDFS文件系统上的文件
之前把val data =sparkSession.read.json(“file:///E:/file/user.json”) 总是写成val data = sparkSession.read.json(“E:/file/user.json”) 这个时候控制台就会报错“Error while looking for metadata directory.”这是因为没有添加"file:///"的缘故,因为不写这个的话,代码在执行的时候会为文件路径"E:/file/user.json"自动添加"hdfs://"的前缀,从而文件路径就变成了“hdfs://master:8020/E:/file/user.json”,而这个文件在HDFS文件系统上是不存在的,所以Spark执行的时候找不到该文件,会报错。由此看来,添加"file:///"前缀后,就可以表明这是一个本地文件了。

读取HDFS文件系统上的文件,则就比较好实现了,实现如下:
与上面的代码相比并没有太大的变动之处,修改文件读取的路径即可

import org.apache.spark.sql.{SQLContext, SparkSession}
object ReadJson {  //Spark SQL读取json文件
  def main(args: Array[String]): Unit = {
    val sparkSession = SparkSession.builder()
      .appName("ReadJson")
      .master("local").getOrCreate()

    import sparkSession.implicits._
	//user.json是HDFS文件系统中的文件, 写法一, 相对路径写法
	val data = sparkSession.read.json("/user/test/user.json")   //spark为其补上"hdfs://"前缀形成文件的全路径,当然也可以直接写全路径如方法二


	//写法二,全路径写法
	//val data = sparkSession.read.json("hdfs://192.168.177.3:8020/user/test/user.json")
    data.show()
  }
}

其中需要注意的是写法一中的相对路径要写作"/user/test/user.json"注意"user"前面的“/”,而不能写成“user/test/user.json”。
其中,我个人的HDFS文件系统上的文件为:
Spark读取本地文件以及读取HDFS文件系统上的文件
至此,就实现了Spark对于本地文件以及HDFS上文件的读取。