【问题标题】:Hive (0.12.0) - Load data into table with partition, buckets and attached indexHive (0.12.0) - 将数据加载到带有分区、存储桶和附加索引的表中
【发布时间】:2014-03-27 21:14:05
【问题描述】:

使用 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';

所有这些显然真的很慢,那么我将如何优化加载过程?

谢谢

【问题讨论】:

    标签: hadoop hive hiveql


    【解决方案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 页面并自行决定哪些参数可能有助于加快您的流程,例如使用的减速器数量不断增加。

    我不能保证使用这种方法会节省您的时间,但您肯定会充分利用您的集群设置。

    【讨论】:

    • 我确实在使用前两个,我会尝试最后一个,谢谢!很高兴知道其他人也做过与我相同的事情。
    猜你喜欢
    • 1970-01-01
    • 2015-03-07
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 2018-12-14
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多