python讀取hdfs上的parquet文件方式
在使用python做大數(shù)據(jù)和機器學習處理過程中,首先需要讀取hdfs數(shù)據(jù),對于常用格式數(shù)據(jù)一般比較容易讀取,parquet略微特殊。從hdfs上使用python獲取parquet格式數(shù)據(jù)的方法(當然也可以先把文件拉到本地再讀取也可以):
1、安裝anaconda環(huán)境。
2、安裝hdfs3。
conda install hdfs3
3、安裝fastparquet。
conda install fastparquet
4、安裝python-snappy。
conda install python-snappy
5、讀取文件
##namenode mode:
from hdfs3 import HDFileSystem
from fastparquet import ParquetFile
hdfs = HDFileSystem(host=IP, port=8020)
sc = hdfs.open
pf = ParquetFile(filename, open_with=sc)
df = pf.to_pandas()
##返回pandas的DataFrame類型
##HA mode:
from hdfs3 import HDFileSystem
from fastparquet import ParquetFile
host = "nameservice1"
conf = {
"dfs.nameservices":"nameservice1",
......
}
hdfs = HDFileSystem(host = host, pars = conf)
......
python訪問HDFS HA的三種方法
python訪問hdfs常用的包有三個,如下:
1、hdfs3
其實從安裝便捷性和使用上來說,并不推薦hdfs3,因為他的系統(tǒng)依賴和網(wǎng)絡要求較高,但是某些情況下使用hdfs3會比較方便,官網(wǎng)資料點這里。如上面介紹,IP直接訪問namenode:
from hdfs3 import HDFileSystem
hdfs = HDFileSystem(host=namenode, port=8020)
hdfs.ls('/tmp')
HA訪問:
host = "nameservice1"
conf = {"dfs.nameservices": "nameservice1",
"dfs.ha.namenodes.nameservice1": "namenode113,namenode188",
"dfs.namenode.rpc-address.nameservice1.namenode113": "hostname_of_server1:8020",
"dfs.namenode.rpc-address.nameservice1.namenode188": "hostname_of_server2:8020",
"dfs.namenode.http-address.nameservice1.namenode188": "hostname_of_server1:50070",
"dfs.namenode.http-address.nameservice1.namenode188": "hostname_of_server2:50070",
"hadoop.security.authentication": "kerberos"
}
fs = HDFileSystem(host=host, pars=conf)
##或者下面這種配置
host = "ns1"
conf = {
"dfs.nameservices":"ns1",
"dfs.ha.namenodes.ns1":"namenode122,namenode115",
"dfs.namenode.rpc-address.ns1.namenode122":"nnlab01:8020",
"dfs.namenode.servicerpc-address.ns1.namenode122":"nnlab01:8022",
"dfs.namenode.http-address.ns1.namenode122":"nnlab01:50070",
"dfs.namenode.https-address.ns1.namenode122":"nnlab01:50470",
"dfs.namenode.rpc-address.ns1.namenode115":"nnlab02:8020",
"dfs.namenode.servicerpc-address.ns1.namenode115":"nnlab02:8022",
"dfs.namenode.http-address.ns1.namenode115":"nnlab02:50070",
"dfs.namenode.https-address.ns1.namenode115":"nnlab02:50470",
}
hdfs = HDFileSystem(host = host, pars = conf)
2、hdfs
這種方法在使用的時候配置比較簡單,官網(wǎng)資料也比較豐富,但是需要注意的是該API可以模擬用戶訪問,權限較大。IP直接訪問:
import hdfs
client = hdfs.client.InsecureClient(url="http://namenode:50070", user="hdfs")
HA訪問:
import hdfs
client = hdfs.client.InsecureClient(url="http://namenode1:50070;http://namenode2:50070", user="hdfs")
3、pyhdfs
安裝命令:pip install PyHDFS
官網(wǎng)地址,直接訪問:
import pyhdfs
client = pyhdfs.HdfsClient(hosts="namenode:50070",user_name="hdfs")
HA訪問
import pyhdfs
client = pyhdfs.HdfsClient(hosts=["namenode1:50070","namenode2:50070"],user_name="hdfs")
補充知識:python spark中parquet文件寫到hdfs,同時避免太多的小文件(block小文件合并)
在pyspark中,使用數(shù)據(jù)框的文件寫出函數(shù)write.parquet經(jīng)常會生成太多的小文件,例如申請了100個block,而每個block中的結果
只有幾百K,這在機器學習算法的結果輸出中經(jīng)常出現(xiàn),這是一種很大的資源浪費,那么如何同時避免太多的小文件(block小文件合并)?
其實有一種簡單方法,該方法需要你對輸出結果的數(shù)據(jù)量有個大概估計,然后使用Dataframe中的coalesce函數(shù)來指定輸出的block數(shù)量
即可,具體使用代碼如下:
df.coalesce(2).write.parquet(path,mode)
這里df是指你要寫出的數(shù)據(jù)框,coalesce(2)指定了寫到2個block中,一個block默認128M,path是你的寫出路徑,mode是寫出模式,常用的是
"overwrite"和"append"。
以上這篇python讀取hdfs上的parquet文件方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
python帶參數(shù)打包exe及調(diào)用方式
今天小編就為大家分享一篇python帶參數(shù)打包exe及調(diào)用方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
Django中url與path及re_path的區(qū)別說明
這篇文章主要介紹了Django中url與path及re_path的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
解決pip install中UnicodeDecodeError問題的處理
這篇文章主要介紹了解決pip install中UnicodeDecodeError問題的處理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-09-09
PyCharm上安裝Package的實現(xiàn)(以pandas為例)
這篇文章主要介紹了PyCharm上安裝Package的實現(xiàn)(以pandas為例),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09
Pyqt5 實現(xiàn)窗口縮放,控件在窗口內(nèi)自動伸縮的操作
這篇文章主要介紹了Pyqt5 實現(xiàn)窗口縮放,控件在窗口內(nèi)自動伸縮的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03

