[英]Partitioning the data while reading from hive/hdfs based on column values in Spark
[英]Understanting file distribution and partitioning in HDFS when using Hive
一方面,他們在HDFS文檔中說:
HDFS旨在支持非常大的文件。 與HDFS兼容的應用程序是處理大型數據集的應用程序。 這些應用程序只寫入一次數據,但是它們讀取一次或多次,並要求在流速下滿足這些讀取。 HDFS支持文件的一次寫入多次讀取語義。 HDFS使用的典型塊大小為64 MB。 因此,HDFS文件被切割成64 MB塊,如果可能,每個塊將駐留在不同的DataNode上。
意味着每個文件將在節點之間分割。
另一方面,當我使用Hive或Spark SQL時,我管理分區的方式是每個分區都有一個文件夾,里面的所有文件都屬於這個分區。 例如:
/Sales
/country=Spain
/city=Barcelona
/2019-08-28.parquet
/2019-08-27.parquet
/city=Madrid
/2019-08-28.parquet
/2019-08-27.parquet
假設每個文件的大小為1GB,HDFS塊大小為128 MB。
所以我很困惑。 我不明白city=Barcelonav/2019-08-28.parquet
是否只保存在一個節點上(甚至與city=Barcelona/2019-08-27.parquet
),或者每個文件分配在8個節點之間節點。
如果每個文件都是分布式的,那么分區的好處是什么?
如果根據我定義的分區分發數據,HDFS如何知道這樣做? 它是否以key=value
的形式查找名稱的文件夾,並確保它們保存完好?
您對“HDFS如何存儲我們轉儲到其中的文件”和“Hive / Spark如何在分區時創建不同目錄”感到困惑。
讓我試着為您提供一個視角。 HDFS就像你提到的那樣工作。 HDFS根據塊大小和要存儲的文件大小將文件分成n
個塊。 元數據(目錄,權限等)是一種抽象,在某種意義上,您看到的文件( 2019-08-27.parquet
)確實分布在節點之間。 Namenode維護元數據。
但是,當我們partition
它會在HDFS上創建不同的目錄。 當您想要使用分區列上的條件查詢數據時,這最終會有所幫助。 僅搜索相關目錄以查找所請求的數據。 如果您繼續查詢分區數據並編寫explain
以查看邏輯計划,則可以在FileScan
階段注意到Partition Filters
。
分區數據仍然以與您提到的相同方式存儲在HDFS上。
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.