簡體   English   中英

hive 如何處理插入內部分區表?

[英]How does hive handle insert into internal partition table?

我需要將記錄流插入 Hive 分區表。 表結構類似於

CREATE TABLE store_transation (
     item_name string,
     item_count int,
     bill_number int,
) PARTITIONED BY (
   yyyy_mm_dd string
);

我想了解 Hive 如何處理內部表中的插入。

是否所有記錄都插入到yyyy_mm_dd=2018_08_31目錄中的單個文件中? 或者 hive 在一個分區內分成多個文件,如果是這樣,什么時候?

如果每天有 100 萬條記錄並且查詢模式將在日期范圍之間,以下哪一項表現良好?

  1. 內表沒有分區
  2. 按日期分區,每個日期只有一個文件
  3. 按日期分區,每個日期有多個文件

Insert 將在您的所有情況下執行相同的操作,因為 insert 不會查詢您現有的數據(除非您使用 select from 自身插入)並且通常每個容器都會創建自己的文件,除非配置了文件合並。

如果表按日期分區,則使用日期范圍查詢數據會更好。 文件太多可能會導致性能下降,因此您可能需要在插入期間合並文件。 什么是文件過多? 就像每個每日分區數百甚至數千。 每個分區的文件很少不會導致性能問題,您不需要合並它們。

Insert 語句將在 partitions 目錄中創建額外的文件,通常不會與現有文件合並。 將創建多少文件取決於插入語句和配置設置。

運行的最終映射器或減速器的數量 + 配置設置將決定輸出文件的數量。 例如,您可以通過添加“order by”子句來強制它在單個減速器上運行。 在這種情況下,每個分區將創建一個額外的文件,但它會運行緩慢。 也可以使用distribute by partition key來減少創建的文件數量,但這會觸發額外的減速器階段,並且比僅映射任務的工作速度慢。

您還可以使用以下設置將新文件與現有文件合並:

SET hive.merge.mapfiles=true;
SET hive.merge.mapredfiles=true;
SET hive.merge.size.per.task=128000000; -- (128MB)
SET hive.merge.smallfiles.avgsize=128000000; -- (128MB)

這些配置設置可能會在最后觸發合並任務(取決於上面設置中配置的大小),它將合並現有文件以及插入新添加的文件。

有關合並的更多詳細信息,請參閱此答案: https : //stackoverflow.com/a/45266244/2700344

實際上,在此上下文中,托管表或外部表的類型無關緊要。 插入或選擇的工作方式相同。

如果您已經有與目標表格式相同的文件,那么最快的方法是將它們放在分區目錄中,根本不使用 DML 查詢。

對於 ORC 文件,您可以使用以下命令有效地合並文件: ALTER TABLE T [PARTITION partition_spec] CONCATENATE;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM