[英]why it is too slow when insert hdfs hive partitioned table?
我已經創建了這樣的表:(未分區)
create external table `ersin_db`.`DW_ETL`
(
`ID` INT,
`NAME` STRING
)
stored as parquet
LOCATION '/user/ers/ersyn61/'
tblproperties('parquet.compression'='SNAPPY');
當我嘗試插入時它很快。
但是當我像這樣創建分區表時:
create external table `ersin_db`.`DW_ETL`
(
`ID` INT,
`NAME` STRING
)
partitioned by(partition_etldate_string string )
stored as parquet
LOCATION '/user/ers/ersyn61/'
tblproperties('parquet.compression'='SNAPPY');
SET hive.exec.dynamic.partition.mode=nonstrict;
SET hive.exec.dynamic.partition=true;
set hive.optimize.sort.dynamic.partition=true;
插入速度慢?
我怎樣才能更快?
提前致謝
我想我可以回答這個問題。
您的第二個表是動態分區表。 在插入動態分區表時,hive 對最終數據進行排序並逐個寫入每個分區(默認行為)。 由於您在 partition_etldate_string 上進行了partition_etldate_string
,因此需要花費大量時間將其逐個插入每個分區。 這是一個典型的 SQL 總結,當它試圖在年、月插入動態分區表時。 注意, SORT
操作需要 17 分鍾,而數據處理只需要 1 分鍾。
Operator #Hosts Avg Time Max Time #Rows Est. #Rows Peak Mem Est. Peak Mem Detail
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
02:SORT 2 17m16s 30m50s 55.05M -1 25.60 GB 12.00 MB
01:EXCHANGE 2 9s493ms 12s822ms 55.05M -1 26.98 MB 2.90 MB HASH(CAST(extract(ts, 'year') AS SMALLINT),CAST(extract(ts, 'month') AS TINYINT))
00:SCAN HDFS 2 51s958ms 1m10s 55.05M -1 76.06 MB 704.00 MB default.my_table
您的第一個表沒有分區,因此 hive 不會對數據進行排序並一次寫入一個分區,但它將所有數據一起寫入。
根據數據量,動態分區可能需要很長時間才能加載。 這是默認行為,我不確定如何解決此問題。 您可以使用 static 分區,但很難處理基於日期的分區。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.