您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了python如何讀取hdfs上的parquet文件,內(nèi)容簡(jiǎn)而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會(huì)有收獲的,下面讓小編帶大家一起來看看吧。
在使用python做大數(shù)據(jù)和機(jī)器學(xué)習(xí)處理過程中,首先需要讀取hdfs數(shù)據(jù),對(duì)于常用格式數(shù)據(jù)一般比較容易讀取,parquet略微特殊。從hdfs上使用python獲取parquet格式數(shù)據(jù)的方法(當(dāng)然也可以先把文件拉到本地再讀取也可以):
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常用的包有三個(gè),如下:
1、hdfs3
其實(shí)從安裝便捷性和使用上來說,并不推薦hdfs3,因?yàn)樗南到y(tǒng)依賴和網(wǎng)絡(luò)要求較高,但是某些情況下使用hdfs3會(huì)比較方便,官網(wǎng)資料點(diǎn)這里。如上面介紹,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
這種方法在使用的時(shí)候配置比較簡(jiǎn)單,官網(wǎng)資料也比較豐富,但是需要注意的是該API可以模擬用戶訪問,權(quán)限較大。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")
補(bǔ)充知識(shí):python spark中parquet文件寫到hdfs,同時(shí)避免太多的小文件(block小文件合并)
在pyspark中,使用數(shù)據(jù)框的文件寫出函數(shù)write.parquet經(jīng)常會(huì)生成太多的小文件,例如申請(qǐng)了100個(gè)block,而每個(gè)block中的結(jié)果
只有幾百K,這在機(jī)器學(xué)習(xí)算法的結(jié)果輸出中經(jīng)常出現(xiàn),這是一種很大的資源浪費(fèi),那么如何同時(shí)避免太多的小文件(block小文件合并)?
其實(shí)有一種簡(jiǎn)單方法,該方法需要你對(duì)輸出結(jié)果的數(shù)據(jù)量有個(gè)大概估計(jì),然后使用Dataframe中的coalesce函數(shù)來指定輸出的block數(shù)量
即可,具體使用代碼如下:
df.coalesce(2).write.parquet(path,mode)
這里df是指你要寫出的數(shù)據(jù)框,coalesce(2)指定了寫到2個(gè)block中,一個(gè)block默認(rèn)128M,path是你的寫出路徑,mode是寫出模式,常用的是
"overwrite"和"append"。
以上就是關(guān)于python如何讀取hdfs上的parquet文件的內(nèi)容,如果你們有學(xué)習(xí)到知識(shí)或者技能,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。