Spark入門:讀寫文件

Spark入門:讀寫文件

一、spark直接讀取本地文件系統的文件(非常不方便,不建議使用):

1、file前綴地址「file:///」

例1:絕對路徑成功

scala> val rdd=sc.textFile("file:///usr/lib/spark-2.0.0/README.md")

rdd: org.apache.spark.rdd.RDD[String] = file:///usr/lib/spark-2.0.0/README.md MapPartitionsRDD[7] at textFile at <console>:24

scala> rdd.first

res3: String = # Apache Spark

說明:

(1)本地文件系統地址的前綴是「file:///」後邊也必須是全部的絕對路徑,不能用相對路徑。

(2)所訪問的文件必須在所有的節點上都存在一個一樣的備份(路徑和文件名稱名一致,內容應該也一樣?)。

本例子中,要載入的數據已經在spark工作目錄,並且hadoop用戶已經有訪問許可權。這在所有節點上是一致的。

例2:相對路徑失敗

scala> val rdd=sc.textFile("file:///./README.md") //失敗

rdd: org.apache.spark.rdd.RDD[String] = file:///./README.md MapPartitionsRDD[19] at textFile at <console>:24

scala> rdd.first

org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: file:/README.md

說明:即便是絕對路徑,而只在master上有的文件,spark也無法訪問。

二、本地文件系統的文件上傳到HDFS系統

1、put命令

例3:上傳本地文件到用戶在HDFS的默認目錄

[hadoop@master dataset]$ hdfs dfs -put ./kinship/kinship.raw input

默認操作:

(1)在HDFS 的用戶默認目錄 hdfs://master:9000/user/hadoop/創建input目錄,

(2)然後把kinship.raw 上傳到該目錄。

[hadoop@master dataset]$ hdfs dfs -ls input

-rw-r--r-- 3 hadoop supergroup 2666 2016-10-22 23:20 input

說明:

(1)目標地址里,如果是「input」和「/input」是不一樣的。

前者的絕對地址是:hdfs://master:9000/user/hadoop/input

後者的絕對地址是:hdfs://master:9000/input

這是最本質的差別。

例4:如下

[hadoop@master dataset]$ hdfs dfs -ls /user/hadoop/input/

-rw-r--r-- 3 hadoop supergroup 2666 2016-10-22 23:20 /user/hadoop/input

2、copyFromLocal命令

例5:copyFromLocal

[hadoop@master dataset]$ hdfs dfs -copyFromLocal ./kinship/kinship.raw input

[hadoop@master dataset]$ hdfs dfs -ls /user/hadoop/input

-rw-r--r-- 3 hadoop supergroup 2666 2016-10-22 23:26 /user/hadoop/input

[hadoop@master dataset]$

三、spark讀寫HDFS文件:

已經知道:HDFS的根目錄是hdfs://master:9000/,用戶默認的目錄是hdfs://master:9000/user/hadoop/

例6:進入spark-shell,將RDD數據寫入HDFS

scala> val rdd1 = sc.parallelize(Seq(1, 2, 3, 4))

rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[15] at parallelize at <console>:24

scala> rdd1.saveAsTextFile("rdd1")

說明:

(1)這裡只給了一個相對路徑"rdd1", 系統默認在hdfs的hdfs://master:9000/user/hadoop/目錄下創建rdd1子目錄,然後保存內容。

絕對路徑就是 "hdfs://master:9000/user/hadoop/rdd1" ,這裡的hadoop是hadoop的用戶名,每個人的安裝配置不一樣,自然不一樣,

user是固定的。

例7:讀取HDFS數據

scala> val rdd2=sc.textFile("hdfs://master:9000/user/hadoop/rdd1")

rdd2: org.apache.spark.rdd.RDD[String] = hdfs://master:9000/user/hadoop/rdd1 MapPartitionsRDD[18] at textFile at <console>:24

scala> rdd2.collect

res12: Array[String] = Array(1, 2, 3, 4)

scala>

例8:不寫入用戶默認目錄,如果給定根目錄符號 「/」,那麼系統會在hdfs的根目錄(hdfs://master:9000/)創建一個rdd3目錄。

scala> val rdd3 = sc.parallelize(Seq(4, 5, 6))

rdd3: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[20] at parallelize at <console>:24

scala> rdd3.saveAsTextFile("/rdd3")

scala> val rdd4=sc.textFile("hdfs://master:9000/rdd3")

rdd4: org.apache.spark.rdd.RDD[String] = hdfs://master:9000/rdd3 MapPartitionsRDD[23] at textFile at <console>:24

scala> rdd3.collect

res15: Array[Int] = Array(4, 5, 6)

scala>

推薦閱讀:

知識布局-mapreduce-wordcount
分散式機器學習的故事:LDA和MapReduce
講座總結|解讀大數據世界中MapReduce的前世今生

TAG:Hadoop | Spark | MapReduce |