大數(shù)據(jù)系列:Spark 常用數(shù)據(jù)格式介紹CSV、JSON意鲸、Avro烦周、Parquet

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)和解析孝扛。

已經(jīng)為大家精心準(zhǔn)備了大數(shù)據(jù)的系統(tǒng)學(xué)習(xí)資料列吼,從Linux-Hadoop-spark-......,需要的小伙伴可以點(diǎn)擊進(jì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)

已經(jīng)為大家精心準(zhǔn)備了大數(shù)據(jù)的系統(tǒng)學(xué)習(xí)資料,從Linux-Hadoop-spark-......乐疆,需要的小伙伴可以點(diǎn)擊進(jìn)入

謂詞下推的基本思想是可以將查詢的某些部分(謂詞)“推送”到存儲(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é)

格式比較

已經(jīng)為大家精心準(zhǔn)備了大數(shù)據(jù)的系統(tǒng)學(xué)習(xí)資料盗舰,從Linux-Hadoop-spark-......,需要的小伙伴可以點(diǎn)擊進(jìn)入

*當(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ě)入速度都非常差。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末片部,一起剝皮案震驚了整個(gè)濱河市镣衡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌档悠,老刑警劉巖廊鸥,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異辖所,居然都是意外死亡惰说,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)缘回,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吆视,“玉大人典挑,你說(shuō)我怎么就攤上這事±舶桑” “怎么了搔弄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)丰滑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)倒庵,這世上最難降的妖魔是什么褒墨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮擎宝,結(jié)果婚禮上郁妈,老公的妹妹穿的比我還像新娘。我一直安慰自己绍申,他們只是感情好噩咪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著极阅,像睡著了一般胃碾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上筋搏,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天仆百,我揣著相機(jī)與錄音,去河邊找鬼奔脐。 笑死俄周,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的髓迎。 我是一名探鬼主播峦朗,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼排龄!你這毒婦竟也來(lái)了波势?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤涣雕,失蹤者是張志新(化名)和其女友劉穎艰亮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體挣郭,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡迄埃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兑障。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侄非。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蕉汪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逞怨,到底是詐尸還是另有隱情者疤,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布叠赦,位于F島的核電站驹马,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏除秀。R本人自食惡果不足惜糯累,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望册踩。 院中可真熱鬧泳姐,春花似錦、人聲如沸暂吉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)慕的。三九已至阎肝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肮街,已是汗流浹背盗痒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留低散,地道東北人俯邓。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像熔号,于是被迫代替她去往敵國(guó)和親稽鞭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容