Spark 常用文件格式
介紹:
Apache Spark支持許多不同的數(shù)據(jù)格式,例如無(wú)處不在的CSV格式和Web友好的JSON格式怎顾。主要用于大數(shù)據(jù)分析目的的常見(jiàn)格式是Apache Parquet和Apache Avro读慎。
在本文中,我們將使用Apache Spark來(lái)介紹這四種格式的特性-CSV杆勇,JSON贪壳,Parquet和Avro。
CSV
CSV(逗號(hào)分隔值)文件通常用于在使用純文本的系統(tǒng)之間交換表格數(shù)據(jù)蚜退。CSV是基于行的文件格式闰靴,這意味著文件的每一行都是表中的行∽曜ⅲ基本上蚂且,CSV包含一個(gè)標(biāo)題行,該標(biāo)題行提供了數(shù)據(jù)的列名幅恋,否則杏死,文件被認(rèn)為是部分結(jié)構(gòu)化的。
CSV文件最初不能顯示層次結(jié)構(gòu)或關(guān)系數(shù)據(jù)捆交。數(shù)據(jù)連接通常使用多個(gè)CSV文件進(jìn)行組織淑翼。外鍵存儲(chǔ)在一個(gè)或多個(gè)文件的列中,但是這些文件之間的鏈接不是由格式本身來(lái)表示的品追。另外玄括,CSV格式尚未完全標(biāo)準(zhǔn)化,因此文件可以使用逗號(hào)以外的定界符肉瓦,例如制表符或空格遭京。
CSV文件的其他屬性之一是,僅當(dāng)它是未壓縮的原始文件或使用可拆分壓縮格式(例如bzip2或lzo)時(shí)泞莉,它們才可以拆分(注意:lzo需要索引才能可拆分D牡瘛)。
好處:
·CSV是人類(lèi)可讀的鲫趁,并且易于手動(dòng)編輯斯嚎。
·CSV提供了簡(jiǎn)單明了的信息模式。
·幾乎所有現(xiàn)有應(yīng)用程序都能處理CSV。
·CSV易于實(shí)現(xiàn)和解析孝扛。
·CSV緊湊苦始。對(duì)于XML寞钥,您可以為每行中的每一列添加開(kāi)始標(biāo)簽和結(jié)束標(biāo)簽。在CSV中陌选,您只需寫(xiě)入一次列標(biāo)題理郑。
缺點(diǎn):
·CSV允許使用平面數(shù)據(jù)。除了格式外咨油,還需要處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu)您炉。
·不支持列類(lèi)型。文本列和數(shù)字列之間沒(méi)有區(qū)別役电。
·沒(méi)有表示二進(jìn)制數(shù)據(jù)的標(biāo)準(zhǔn)方法赚爵。
·導(dǎo)入CSV的問(wèn)題(NULL和引號(hào)之間沒(méi)有區(qū)別)。
·特殊字符支持差法瑟。
·缺乏通用標(biāo)準(zhǔn)冀膝。
盡管存在局限性,但CSV文件還是數(shù)據(jù)共享的流行選擇霎挟,因?yàn)樗鼈兊玫搅藦V泛的業(yè)務(wù)應(yīng)用程序窝剖,消費(fèi)者和科學(xué)應(yīng)用程序的支持。同樣酥夭,大多數(shù)批處理和流數(shù)據(jù)處理模塊(例如Spark和Hadoop)最初都支持CSV文件的序列化和反序列化赐纱,并提供了在讀取時(shí)添加架構(gòu)的方法。
JSON格式
JSON數(shù)據(jù)(JavaScript對(duì)象表示法)以部分結(jié)構(gòu)化格式表示為鍵值對(duì)熬北。JSON通常與XML進(jìn)行比較疙描,因?yàn)樗梢园捶謱痈袷酱鎯?chǔ)數(shù)據(jù)。子數(shù)據(jù)由父數(shù)據(jù)顯示讶隐。兩種格式都是自描述的淫痰,并且可由用戶讀取,但是JSON文檔通常要小得多整份。因此,它們更常用于網(wǎng)絡(luò)通信中籽孙,尤其是隨著基于REST的Web服務(wù)的出現(xiàn)烈评。
由于許多數(shù)據(jù)傳輸已經(jīng)使用JSON格式,因此大多數(shù)Web語(yǔ)言最初都支持JSON或使用外部庫(kù)對(duì)JSON數(shù)據(jù)進(jìn)行序列化和反序列化犯建。由于有了這種支持讲冠,JSON通過(guò)顯示數(shù)據(jù)結(jié)構(gòu),熱數(shù)據(jù)的交換格式和冷數(shù)據(jù)存儲(chǔ)以邏輯格式使用适瓦。
許多批處理和流數(shù)據(jù)處理模塊本機(jī)支持JSON序列化和反序列化竿开。盡管JSON文檔中包含的數(shù)據(jù)最終可以以性能更優(yōu)化的格式(例如Parquet或Avro)存儲(chǔ)谱仪,但它們提供原始數(shù)據(jù),這對(duì)于重新處理數(shù)據(jù)非常重要(如有必要)否彩。
JSON文件具有以下優(yōu)點(diǎn):
·JSON支持分層結(jié)構(gòu)疯攒,簡(jiǎn)化了一個(gè)文檔中相關(guān)數(shù)據(jù)的存儲(chǔ)和復(fù)雜關(guān)系的表示。
·大多數(shù)語(yǔ)言都提供簡(jiǎn)化的JSON序列化庫(kù)或?qū)SON序列化/反序列化的內(nèi)置支持列荔。
·JSON支持對(duì)象列表敬尺,有助于避免列表到關(guān)系數(shù)據(jù)模型的錯(cuò)誤轉(zhuǎn)換。
·JSON是NoSQL數(shù)據(jù)庫(kù)(例如MongoDB贴浙,Couchbase和Azure Cosmos DB)廣泛使用的文件格式砂吞。
·當(dāng)今大多數(shù)工具中的內(nèi)置支持。
Parquet
Parquet于2013年推出崎溃,由Cloudera和Twitter開(kāi)發(fā)蜻直,用作基于列的存儲(chǔ)格式,已針對(duì)多列數(shù)據(jù)集進(jìn)行了優(yōu)化袁串。由于數(shù)據(jù)是按列存儲(chǔ)的概而,因此可以進(jìn)行高度壓縮(壓縮算法對(duì)信息熵較低的數(shù)據(jù)(通常包含在列中)的性能更好),并且可以拆分般婆。該格式的開(kāi)發(fā)者聲稱(chēng)到腥,這種存儲(chǔ)格式非常適合大數(shù)據(jù)問(wèn)題。
與CSV和JSON不同蔚袍,Parquet文件是二進(jìn)制文件乡范,其中包含有關(guān)其內(nèi)容的元數(shù)據(jù)。因此啤咽,無(wú)需讀取/解析文件的內(nèi)容晋辆,Spark可以僅依靠元數(shù)據(jù)來(lái)確定列名稱(chēng),壓縮/編碼宇整,數(shù)據(jù)類(lèi)型瓶佳,甚至一些基本統(tǒng)計(jì)信息。Parquet文件的列元數(shù)據(jù)存儲(chǔ)在文件的末尾鳞青,從而可以進(jìn)行快速的一次性寫(xiě)入霸饲。
Parquet針對(duì)“一次寫(xiě)入多次讀取”(WORM)范例進(jìn)行了優(yōu)化。寫(xiě)起來(lái)很慢臂拓,但是讀起來(lái)卻快得令人難以置信厚脉,尤其是當(dāng)您僅訪問(wèn)總列的一個(gè)子集時(shí)。對(duì)于需要大量讀取的工作負(fù)載胶惰,鑲木地板是一個(gè)不錯(cuò)的選擇傻工。對(duì)于需要對(duì)整行數(shù)據(jù)進(jìn)行操作的用例,應(yīng)使用CSV或AVRO之類(lèi)的格式。
Parquet中數(shù)據(jù)存儲(chǔ)的優(yōu)點(diǎn):
·Parquet是一種柱狀格式。僅需要的列將被獲取/讀取,這減少了磁盤(pán)I / O半火。這個(gè)概念稱(chēng)為投影下推乖酬。
·模式隨數(shù)據(jù)一起移動(dòng),因此數(shù)據(jù)是自描述的。
·盡管事實(shí)是它是為HDFS創(chuàng)建的,但數(shù)據(jù)仍可以存儲(chǔ)在其他文件系統(tǒng)中,例如GlusterFs或NFS之上科雳。
·Parquet只是文件,這意味著可以輕松使用它們脓杉,移動(dòng)糟秘,備份和復(fù)制它們。
·開(kāi)箱即用的Spark內(nèi)部支持提供了將文件簡(jiǎn)單地保存并保存到存儲(chǔ)中的功能球散。
·即使使用像Snappy這樣的壓縮格式尿赚,Parquet也可以提供高達(dá)75%的極佳壓縮率。
·如實(shí)踐所示蕉堰,與其他文件格式相比凌净,此格式是讀取工作流最快的格式。
·Parquet非常適用于需要對(duì)大量數(shù)據(jù)的某些列進(jìn)行聚合的數(shù)據(jù)倉(cāng)庫(kù)類(lèi)型的解決方案屋讶。
·可以使用Avro API和Avro Schema(可以將所有原始數(shù)據(jù)存儲(chǔ)為Avro格式冰寻,但將所有處理后的數(shù)據(jù)存儲(chǔ)在Parquet中)來(lái)讀取和寫(xiě)入Parquet。
·它還提供謂詞下推皿渗,從而進(jìn)一步降低了磁盤(pán)I / O成本斩芭。
謂詞下推/過(guò)濾下推(Predicate Pushdown/Filter Pushdown)
謂詞下推的基本思想是可以將查詢的某些部分(謂詞)“推送”到存儲(chǔ)數(shù)據(jù)的位置划乖。例如,當(dāng)我們提供一些過(guò)濾條件時(shí)挤土,數(shù)據(jù)存儲(chǔ)將在從磁盤(pán)讀取數(shù)據(jù)時(shí)嘗試過(guò)濾記錄琴庵。
謂詞下推的優(yōu)點(diǎn)是更少的磁盤(pán)I / O發(fā)生。結(jié)果仰美,性能更好迷殿。否則,整個(gè)數(shù)據(jù)將被帶入內(nèi)存咖杂,然后進(jìn)行過(guò)濾庆寺,這將導(dǎo)致大量的內(nèi)存需求。
此優(yōu)化可以通過(guò)較早而不是稍后過(guò)濾掉數(shù)據(jù)來(lái)大大減少查詢/處理時(shí)間翰苫。根據(jù)處理框架的不同,謂詞下推可以通過(guò)執(zhí)行以下操作來(lái)優(yōu)化查詢,例如在通過(guò)網(wǎng)絡(luò)傳輸之前過(guò)濾數(shù)據(jù)奏窑,在加載到內(nèi)存之前過(guò)濾數(shù)據(jù)或跳過(guò)讀取整個(gè)文件或文件塊的操作导披。
大多數(shù)RDBMS都遵循此概念,Parquet和ORC等大數(shù)據(jù)存儲(chǔ)格式也遵循此概念埃唯。
投影下推(Projection Pushdown)
從數(shù)據(jù)存儲(chǔ)中讀取數(shù)據(jù)時(shí)撩匕,根據(jù)查詢,僅將讀取那些必需的列墨叛;并非所有字段都將被讀取止毕。通常,Parquets和ORC之類(lèi)的列格式遵循此概念漠趁,從而產(chǎn)生更好的I / O性能扁凛。
Avro
Apache Avro由Hadoop工作組于2009年發(fā)布。它是一種基于行的格式闯传,可高度拆分谨朝。它也被描述為類(lèi)似于Java序列化的數(shù)據(jù)序列化系統(tǒng)。模式以JSON格式存儲(chǔ)甥绿,而數(shù)據(jù)以二進(jìn)制格式存儲(chǔ)字币,從而最大程度地減小了文件大小并提高了效率。
Avro通過(guò)管理添加的字段共缕,缺少的字段和已更改的字段洗出,為模式演變提供了強(qiáng)大的支持。這使舊軟件可以讀取新數(shù)據(jù)图谷,而新軟件可以讀取舊數(shù)據(jù)-如果您的數(shù)據(jù)有可能更改翩活,則這是一項(xiàng)關(guān)鍵功能。
借助Avro的模式架構(gòu)管理能力蜓萄,可以在不同時(shí)間獨(dú)立更新組件隅茎,從而降低不兼容風(fēng)險(xiǎn)。這使應(yīng)用程序不必編寫(xiě)if-else語(yǔ)句來(lái)處理不同的架構(gòu)版本嫉沽,并且使開(kāi)發(fā)人員不必查看舊代碼來(lái)理解舊架構(gòu)辟犀。
由于架構(gòu)的所有版本都存儲(chǔ)在人類(lèi)可讀的JSON標(biāo)頭中,因此很容易理解所有可用字段绸硕。
Avro可以支持許多不同的編程語(yǔ)言堂竟。因?yàn)榧軜?gòu)是在數(shù)據(jù)以二進(jìn)制形式存儲(chǔ)時(shí)以JSON格式存儲(chǔ)的,所以Avro是持久性數(shù)據(jù)存儲(chǔ)和電匯的相對(duì)緊湊的選擇玻佩。由于Avro易于附加新行出嘹,因此它通常是繁重的寫(xiě)工作負(fù)載的首選格式。
好處:
·Avro是與語(yǔ)言無(wú)關(guān)的數(shù)據(jù)序列化咬崔。
·Avro將模式存儲(chǔ)在文件的標(biāo)題中税稼,以便數(shù)據(jù)可以自我描述烦秩。
·Avro格式的文件可拆分且可壓縮,因此非常適合在Hadoop生態(tài)系統(tǒng)中進(jìn)行數(shù)據(jù)存儲(chǔ)郎仆。
·用于讀取Avro文件的架構(gòu)不必與用于寫(xiě)入文件的架構(gòu)相同只祠。這樣就可以獨(dú)立添加新字段。
·與序列文件一樣扰肌,Avro文件也包含用于分隔塊的同步標(biāo)記抛寝。這使其高度可拆分。
·可以使用諸如snappy之類(lèi)的壓縮格式來(lái)壓縮這些塊曙旭。
總結(jié)
格式比較
*當(dāng)壓縮為CSV時(shí)桂躏,JSON具有可拆分性相同的問(wèn)題钻趋,但有一個(gè)額外的區(qū)別。當(dāng)“ wholeFile”選項(xiàng)設(shè)置為true時(shí)(例如:SPARK-18352)沼头,JSON不可拆分爷绘。
1. CSV通常應(yīng)該是最快寫(xiě)入的。JSON應(yīng)該是人類(lèi)最容易理解的进倍。Parquet應(yīng)該是最快讀取列的一個(gè)子集土至,而Avro應(yīng)該是最快讀取一次所有列的。
2. JSON是用于在網(wǎng)絡(luò)上進(jìn)行通信的標(biāo)準(zhǔn)猾昆。由于API和網(wǎng)站的可用性屬性(如定義良好的架構(gòu))陶因,它們一直在使用JSON進(jìn)行通信。
3. Parquet和Avro絕對(duì)針對(duì)大數(shù)據(jù)需求進(jìn)行了優(yōu)化垂蜗,包括可拆分性楷扬,壓縮支持,對(duì)復(fù)雜數(shù)據(jù)結(jié)構(gòu)的強(qiáng)大支持贴见。不幸的是烘苹,可讀性和寫(xiě)入速度都非常差。