Hive管道的设计

Design of a Hive pipeline

我正在努力寻找在 Hive 和 HDFS 中实现以下管道的最佳方法:

我想摄取一个 csv(到目前为止没有问题)但是,我想从通知到 csv 文件的字段中创建分区。

我创建了一个外部 table 将文件存放在 HDFS 上并定义了分区字段,但是通过简单的放置(这是有道理的)分区没有创建,当我得到退出代码 1 时试图删除 msck 修复 table.

我想知道以下是否可行或可行:

  1. 将 CSV 文件加载到内部配置单元 table 中并作为临时文件 table。

  2. 使用分区

  3. 插入"official"table

这是一种有效的方法吗?如果是这样,我还没有找到很多关于如何做第一个的信息。

谢谢。

如果每个文件只有一个分区,那么您可以使用

直接加载到目标 table 分区
hive> LOAD DATA LOCAL INPATH 'yourpath/yourfile.csv' OVERWRITE INTO TABLE your_table PARTITION (key='value');

最坏的情况如果每个文件有很多分区那么你需要先加载到中间table然后使用insert-overwrite-select:

重新分区数据
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

insert overwrite official_table partition(partition_key) 
 select col1, col2, partition_col --partition is the last one
from intermediate table... 

并且您需要一次加载(覆盖)所有整个分区数据,如果不可能,那么select应该将目标分区中已经存在的数据与增量加载合并。

查看此回答,了解如何

此外,INSERT (NOT OVERWRITE) INTO table (partition) select ... 是插入增量数据的可能解决方案。此语句应将数据加载到分区文件夹中的其他文件中,现有数据将保持原样。