Pyspark:讀取本地文件和HDFS文件

1.讀取本地文件

首先需要在目錄“/usr/local/spark/mycode/wordcount”下,建好一個word.txt:

hadoop@rachel-virtual-machine:/usr/local/spark$ ./bin/pyspark
./bin/pyspark: 行 45: python: 未找到命令
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
2019-08-28 16:29:50 WARN  Utils:66 - Your hostname, rachel-virtual-machine resolves to a loopback address: 127.0.1.1; using 192.168.80.128 instead (on interface ens33)
2019-08-28 16:29:50 WARN  Utils:66 - Set SPARK_LOCAL_IP if you need to bind to another address
2019-08-28 16:30:02 WARN  NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.3.3
      /_/

Using Python version 3.6.8 (default, Jan 14 2019 11:02:34)
SparkSession available as 'spark'.
>>> textFile = sc.textFile('file:///usr/local/spark/mycode/wordcount/word.txt')

sc.textFile()中的這個textFile是sc的一個方法名稱,這個方法用來加載文件數據。這兩個textFile不是一個東西,不要混淆。

實際上,前面的變量textFile,你完全可以換個變量名稱,比如, line=sc.textFile(“file:///usr/local/spark/mycode/wordcount/word.txt”)。這裏使用相同名稱,就是有意強調二者的區別。


注意,要加載本地文件,必須採用“file:///”開頭的這種格式。執行上上面這條命令以後,並不會馬上顯示結果,因爲,Spark採用惰性機制,只有遇到“行動”類型的操作,纔會從頭到尾執行所有操作。

下面我們執行一條“行動”類型的語句,就可以看到結果:

>>> textFile.first()
'Type "help", "copyright", "credits" or "license" for more information.'        

first()是一個“行動”(Action)類型的操作,會啓動真正的計算過程,從文件中加載數據到變量textFile中,並取出第一行文本。你可以從這些結果信息中,找到word.txt文件中的第一行的內容。

正因爲Spark採用了惰性機制,在執行轉換操作的時候,即使我們輸入了錯誤的語句,pyspark也不會馬上報錯,而是等到執行“行動”類型的語句時啓動真正的計算,那個時候“轉換”操作語句中的錯誤就會顯示出來,比如:

>>> textFile = sc.textFile("file:///usr/local/spark/mycode/wordcount/word123.txt")

上面我們使用了一個根本就不存在的word123.txt,執行上面語句時,pyspark根本不會報錯,因爲,沒有遇到“行動”類型的first()操作之前,這個加載操作時不會真正執行的。然後,我們執行一個“行動”類型的操作first(),如下:

如何把textFile變量中的內容再次寫回到另外一個目錄wordback中:

>>> textFile = sc.textFile("file:///usr/local/spark/mycode/wordcount/word.txt")
>>> textFile.saveAsTextFile("file:///usr/local/spark/mycode/wordcount/writeback")

上面的saveAsTextFile()括號裏面的參數是保存文件的路徑,不是文件名。saveAsTextFile()是一個“行動”(Action)類型的操作,所以,馬上會執行真正的計算過程,從word.txt中加載數據到變量textFile中,然後,又把textFile中的數據寫回到本地文件目錄“/usr/local/spark/mycode/wordcount/writeback/”下面。

 

2.讀取HDFS文件

爲了能夠讀取HDFS中的文件,請首先啓動Hadoop中的HDFS組件。(由於用不到MapReduce組件,所以,不需要啓動MapReduce或者YARN)

hadoop@rachel-virtual-machine:/usr/local/hadoop$ ./sbin/start-dfs.sh
Starting namenodes on [localhost]
hadoop@localhost's password: 
localhost: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-rachel-virtual-machine.out
hadoop@localhost's password: 
localhost: starting datanode, logging to /usr/local/hadoop/logs/hadoop-hadoop-datanode-rachel-virtual-machine.out
Starting secondary namenodes [0.0.0.0]
[email protected]'s password: 
0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-secondarynamenode-rachel-virtual-machine.out
hadoop@rachel-virtual-machine:/usr/local/hadoop$ 
hadoop@rachel-virtual-machine:/usr/local/hadoop$ jps
3450 Jps
1915 SparkSubmit
2475 DataNode
2731 SecondaryNameNode
2318 NameNode

下面我們使用命令查看一下HDFS文件系統中的目錄和文件:

hadoop@rachel-virtual-machine:/usr/local/hadoop$ ./bin/hdfs dfs -ls .
ls: `.': No such file or directory

這是因爲在HDFS文件系統中,還沒有爲當前Linux登錄用戶創建目錄,使用下面命令創建:

hadoop@rachel-virtual-machine:/usr/local/hadoop$ ./bin/hdfs dfs -mkdir -p /user/hadoop

HDFS文件系統爲Linux登錄用戶開闢的默認目錄是“/user/用戶名”(注意:是user,不是usr),因爲本機是用戶名hadoop登錄Linux系統,所以,上面創建了“/user/hadoop”目錄,再次強調,這個目錄是在HDFS文件系統中,不在本地文件系統中。

hadoop@rachel-virtual-machine:/usr/local/hadoop$ ./bin/hdfs dfs -ls .
hadoop@rachel-virtual-machine:/usr/local/hadoop$ 

上面命令中,最後一個點號“.”,表示要查看Linux當前登錄用戶hadoop在HDFS文件系統中與hadoop對應的目錄下的文件,也就是查看HDFS文件系統中“/user/hadoop/”目錄下的文件,所以,下面兩條命令是等價的:

./bin/hdfs dfs -ls .
./bin/hdfs dfs -ls /user/hadoop

如果要查看HDFS文件系統根目錄下的內容,需要使用下面命令:

hadoop@rachel-virtual-machine:/usr/local/hadoop$ ./bin/hdfs dfs -ls /
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2019-08-28 16:57 /user

下面,我們把本地文件系統中的“/usr/local/spark/mycode/wordcount/word.txt”上傳到分佈式文件系統HDFS中(放到hadoop用戶目錄下):

hadoop@rachel-virtual-machine:/usr/local/hadoop$ ./bin/hdfs dfs -put /usr/local/spark/mycode/wordcount/word.txt .
hadoop@rachel-virtual-machine:/usr/local/hadoop$ ./bin/hdfs dfs -ls .
Found 1 items
-rw-r--r--   1 hadoop supergroup        625 2019-08-28 17:03 word.txt

可以看到,確實多了一個word.txt文件,我們使用cat命令查看一個HDFS中的word.txt文件的內容,命令如下:

hadoop@rachel-virtual-machine:/usr/local/hadoop$ ./bin/hdfs dfs -cat ./word.txt
Type "help", "copyright", "credits" or "license" for more information.
2019-08-28 15:27:12 WARN  Utils:66 - Your hostname, rachel-virtual-machine resolves to a loopback address: 127.0.1.1; using 192.168.80.128 instead (on interface ens33)
2019-08-28 15:27:12 WARN  Utils:66 - Set SPARK_LOCAL_IP if you need to bind to another address
2019-08-28 15:27:23 WARN  NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to

上面命令執行後,就會看到HDFS中word.txt的內容了。

回到pyspark窗口,編寫語句從HDFS中加載word.txt文件:

>>> textFile = sc.textFile("hdfs://localhost:9000/user/hadoop/word.txt")
>>> textFile.first()
'Type "help", "copyright", "credits" or "license" for more information.'

執行上面語句後,就可以看到HDFS文件系統中(不是本地文件系統)的word.txt的第一行內容了。

需要注意的是,sc.textFile(“hdfs://localhost:9000/user/hadoop/word.txt”)中,“hdfs://localhost:9000/”是前面介紹Hadoop安裝內容時確定下來的端口地址9000。實際上,也可以省略不寫,如下三條語句都是等價的:

>>> textFile = sc.textFile("hdfs://localhost:9000/user/hadoop/word.txt")
>>> textFile = sc.textFile("/user/hadoop/word.txt")
>>> textFile = sc.textFile("word.txt")

下面,我們再把textFile的內容寫回到HDFS文件系統中(寫到hadoop用戶目錄下):

>>> textFile.saveAsTextFile("writeback")

執行上面命令後,文本內容會被寫入到HDFS文件系統的“/user/hadoop/writeback”目錄下,我們可以切換到Linux Shell命令提示符窗口查看一下:

hadoop@rachel-virtual-machine:/usr/local/hadoop$ ./bin/hdfs dfs -ls .
Found 2 items
-rw-r--r--   1 hadoop supergroup        625 2019-08-28 17:03 word.txt
drwxr-xr-x   - hadoop supergroup          0 2019-08-28 17:08 writeback

下面我們查看該目錄下有什麼文件:

hadoop@rachel-virtual-machine:/usr/local/hadoop$ ./bin/hdfs dfs -ls ./writeback
Found 3 items
-rw-r--r--   1 hadoop supergroup          0 2019-08-28 17:08 writeback/_SUCCESS
-rw-r--r--   1 hadoop supergroup        334 2019-08-28 17:08 writeback/part-00000
-rw-r--r--   1 hadoop supergroup        291 2019-08-28 17:08 writeback/part-00001

執行結果中如上。我們使用下面命令輸出part-00000文件的內容(注意:part-00000裏面有五個零):

hadoop@rachel-virtual-machine:/usr/local/hadoop$ ./bin/hdfs dfs -cat ./writeback/part-00000
Type "help", "copyright", "credits" or "license" for more information.
2019-08-28 15:27:12 WARN  Utils:66 - Your hostname, rachel-virtual-machine resolves to a loopback address: 127.0.1.1; using 192.168.80.128 instead (on interface ens33)
2019-08-28 15:27:12 WARN  Utils:66 - Set SPARK_LOCAL_IP if you need to bind to another address

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章