天天看點

Spark上對SequenceFile的支援Scala環境下的支援pyspark下的支援總結

本文介紹現在spark提供的api裡對hadoop sequencefile的讀寫支援,涉及到的類和使用方式,包括scala環境和python環境。

spark下涉及到seqeucenfile的讀寫,主要有兩類體系,第一類是帶'sequencefile'的方法,第二類是帶'objectfile'的方法。

以下是sparkcontext下的三個讀取seqeucenfile的方法,除了指定path路徑外,還需要聲明key,value對應的hadoop writable類,此外還可以指定分區數。

讀取的時候的k,v,可以直接寫org.apache.hadoop.io.byteswritable這樣的類,也可以寫基本類型,如int,string,會被隐式轉換成對應的org.apache.hadoop.io.intwritable,org.apache.hadoop.io.text。

另一方面,第二類方法是objectfile方法

該方法對應的是rdd裡面saveasobjectfile的方法,key class是nullwritable,value class是byteswritable,且反序列化過程也指明好了,利用的是utils裡的序列化方法,可以看到,裡面的序列化利用的是java原生的序列化方式,如下:

下面先繼續介紹sequencefile的寫方法,調用的是rdd的saveasobjectfile方法,如下,

對應到sparkcontext裡的objectfile方法,rdd的save也指定了key、value的writable類,利用的是同一套序列化方式,

回過頭繼續看rdd的saveasobjectfile方法裡,在做完map操作後,其實是隐式生成了sequencefilerddfunction類,具體implicit的定義在sparkcontext裡:

是以其實調用的是sequencefilerddfunction的saveassequencefile方法,在該方法裡,最終調用的是rdd的savehadoopfile這個老的hadoop file方法,并且傳遞了sequencefileoutputformat這個format給savehadoopfile方法,進而完成hadoop file的寫入。

下面是一個簡單的讀寫sequencefile的例子,可以自己在spark-shell裡嘗試下

上面在讀出來反序列化的時候,我模仿utils裡的方式利用java.io手動反序列出來了。

其實也可以模仿rdd的那個saveasobjectfile方法,自己設定key,value,序列化方式等設定,改造下面這段代碼裡的transformation過程,

如上所說,已經比較清晰地說明了sequencfile讀寫的來龍去脈了,也給出了簡單的讀寫例子,包括如何聲明writable類型,甚至可以模仿rdd的saveasobjectfile方法做到更好的讀寫控制。

python環境下的支援可以參考這個pr,目前已經合進社群的master分支裡了。之前python環境下隻支援textfile。這個pr除了支援sequencefile的讀寫外,還支援了hadoop下其他format檔案的讀取。主要是增加了pythonrdd裡的sequencefile、newapihadoopfile等的支援,然後在python/pyspark/context.py裡增加了上下文裡的相應方法支援,使得pyspark裡也可以得到豐富的hadoop file讀取的支援。

使用的話,直接讀取就可以了

本文介紹了spark對hadoop sequencefile的讀寫支援,實作方式以及簡單的使用方法。sequencefile和textfile類似,在上下文裡有直接提供讀取方法,但最終走的還是hadoopfile方法。

全文完 :)