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()
}
}
之前把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上文件的读取。