hadoop - Hive(0.12.0)-使用分区,存储桶和附加索引将数据加载到表中

标签 hadoop hive hiveql

使用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/

相关文章:

java - 确定 EMR 作业在 Map 与 Reduce 任务上花费了多少时间的最佳方法是什么?

sql - UNION ALL 不会在 Hive 中生成任何数据

java - 使用 Java 将数据存储为 Apache Spark 中的 Hive 表

hadoop - 从本地计算机连接配置单元时,HA群集上的java.net.UnknownHostException:<CLUSTER_NAME>

hadoop - 将文件样本从 hdfs 复制到本地 fs?

hadoop 未在多节点集群中运行

Hadoop 集群要求软件/硬件

mysql - Hive 哈希函数结果为 0、null 和 1,为什么?

hive - Hive 表名最大字符数限制是多少?

hadoop - 使用 hive -e 'select' 打印列标题时是否可以停止 HIVE 打印数据库?