使用Hive 0.12.0,我正在寻找一个已分区的表,并使用存储在HDFS上的数据的存储桶。我还想在外键上创建该表的索引,在连接表时将使用很多索引。
我有一个可行的解决方案,但有一点告诉我它效率很低。
这是我的工作:
我将数据加载到“平面”中间表(无分区,无存储桶)中:
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';
所有这些显然很慢,所以我将如何优化加载过程?
谢谢
最佳答案
每当我有类似要求时,由于找不到有效的替代方法,因此我使用的方法几乎与您相同。
但是,为了使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;
我确定您必须使用前两个,并且可以根据数据大小设置后两个。
您可以 check out Configuration Properties这个页面,并自行决定哪些参数可能有助于加快您的流程,例如使用的 reducer 数量增加。
我不能保证使用这种方法可以节省您的时间,但可以肯定的是,您将充分利用群集设置。
关于hadoop - Hive(0.12.0)-使用分区,存储桶和附加索引将数据加载到表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22699327/