2016-08-22 47 views
0

我的數據是用Parquet文件(平均爲< 1mb)編寫的相對較小的Avro記錄的形式。實木複合地板分區和HDFS文件大小

到目前爲止,我用我的本地文件系統來做一些Spark測試。

我使用目錄分層結構對數據進行分區。

我不知道是不是更好地「建立」分配到Avro記錄和積累更大的文件......然而我想象分區的Parquet文件將「映射」到HDFS分區文件中。

哪種方法最好?

編輯(澄清基於評論):

  • 「建立分區到的Avro記錄」:想象我的目錄結構是P1 = /P2 = /file.avro並且Avro公司記錄包含字段F1和F2。我可以將所有這些保存在包含字段P1,P2,F1和F2的單個Avro文件中。即沒有需要與目錄的分區結構,因爲它全部在Avro記錄中存在

  • 關於Parquet分區和HDFS分區:HDFS會在不同的機器上拆分一個大的Parquet文件,這將對應於不同的Parquet分區? (我不知道這是否澄清我的問題 - 如果不是這意味着我真的不明白)

+0

我完全不明白你在問什麼(你是指「在Avro記錄上建立分區」和「分區Parquet文件將映射到HDFS分區文件「),但我會嘗試回答。一般來說,從我的觀點來看,處理大文件總是更好(我通常使用每個文件100M-1G的大小)。分區時也應該避免使用少量數據創建文件夾。如果你想創建更大的parquet文件,使用coalesce()。最後當從HDFS實驗室讀取分區時會匹配輸入文件,所以如果你問的是那麼是的。 –

+0

@TalJoffe謝謝你的回答,我會考慮一下。我澄清了我的問題,是更好的?我不知道'coalesce()',那可能是我應該看的地方。 –

+1

o.k.大。我看到了你的編輯,所以我給出了一個答案,試試和幫助。我知道這是否回答了你的問題 –

回答

0

背後使用的文件夾級別劃分的主要理由是,當星火例如讀取數據,並分區列上有一個過濾器(只要格式爲path/partitionName = value,就從文件夾名中提取),它只會讀取所需的文件夾(而不是讀取所有內容,然後應用過濾器)。所以如果你想使用這種機制在你的文件夾結構中使用層次結構(我經常使用它)。

一般來說,我會建議避免與小數據的許多文件夾在其中(不知道這裏的情況)

約星火輸入劃分(同字不同的含義),從HDFS星火讀取時會嘗試讀取文件,以便分區與HDFS上的文件相匹配(防止混洗),因此如果數據由HDFS分區,則spark會匹配相同的分區。據我所知,HDFS不會對文件進行分區,而是複製它們(以提高可靠性),所以我認爲一個大型的parquet文件將轉化爲HDFS上的單個文件,除非您重新分區或定義分區數量閱讀時(根據Spark版本有幾種方式,請參見this

相關問題