Hive管道的设计

vvppvyoh  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(238)

我正在努力找到在hive和hdfs中实现以下管道的最佳方法:
我想摄取一个csv(到目前为止没有问题),但是,我想分区是从一个字段来通知到csv文件。
我创建了一个外部表,将文件存放在hdfs上,并定义了partition字段,但是通过一个简单的put(这很有意义),分区没有生成,并且在尝试删除msck修复表时得到了退出代码1。
我想知道以下是否可行:
将csv文件加载到内部配置单元表中并作为临时表。
在“正式”表中插入分区
这是一个有效的方法吗?如果是这样的话,我还没有找到很多关于如何做第一个的信息。
谢谢。

xmd2e60i

xmd2e60i1#

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

hive> LOAD DATA LOCAL INPATH 'yourpath/yourfile.csv' OVERWRITE INTO TABLE your_table PARTITION (key='value');

最坏的情况是,如果每个文件有多个分区,则需要首先加载到中间表中,然后使用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...

并且您需要一次加载(覆盖)所有的分区数据,如果不可能,那么选择应该用增量加载合并目标分区中已经存在的数据。
有关如何合并增量更新,请参阅此答案。
INSERT (NOT OVERWRITE) INTO table (partition) select ... 是插入增量数据的可能解决方案。此语句应将数据加载到分区文件夹中的其他文件中,现有数据将保持原样。

相关问题