使用Hive 0.12.0,我希望填充一个已分区的表,并使用存储在HDFS上的数据桶。我还想在外键上创建这个表的索引,在连接表时我会经常使用它。
我有一个有效的解决方案,但有些东西告诉我这是非常低效的。
这是我做的: 我将数据加载到" flat"中间表(没有分区,没有桶):
LOAD DATA LOCAL INPATH 'myFile' OVERWRITE INTO TABLE my_flat_table;
然后我从这个平面表中选择我需要的数据并将其插入到最终的分区和分区表中:
FROM my_flat_table
INSERT OVERWRITE TABLE final_table
PARTITION(date)
SELECT
col1, col2, col3, to_date(my_date) AS date;
我在创建决赛桌时更早定义了分组:
CREATE TABLE final_table
(col1 TYPE1, col2 TYPE2, col3 TYPE3)
PARTITIONED BY (date DATE)
CLUSTERED BY (col2) INTO 64 BUCKETS;
最后,我在用于存储的同一列上创建索引(这甚至有用吗?):
CREATE INDEX final_table_index ON TABLE final_table (col2) AS 'COMPACT';
所有这一切显然都很慢,那么我将如何优化加载过程呢?
谢谢
答案 0 :(得分:1)
每当我有类似的要求时,我使用了几乎相同的方法,因为我找不到有效的替代方法。
然而,为了使Dynamic Partitioning
的过程有点快,我尝试设置一些配置参数,如:
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.dynamic.partition=true;
set hive.exec.max.dynamic.partitions = 2000;
set hive.exec.max.dynamic.partitions.pernode = 10000;
我相信您必须使用前两个,并且可以根据您的数据大小设置最后两个。
您可以查看此Configuration Properties页面,自行决定哪些参数可以帮助您快速完成流程,例如:越来越多的减速机使用。
我不能保证使用这种方法可以节省您的时间,但绝对可以充分利用您的群集设置。