Hive管道的设计
Design of a Hive pipeline
我正在努力寻找在 Hive 和 HDFS 中实现以下管道的最佳方法:
我想摄取一个 csv(到目前为止没有问题)但是,我想从通知到 csv 文件的字段中创建分区。
我创建了一个外部 table 将文件存放在 HDFS 上并定义了分区字段,但是通过简单的放置(这是有道理的)分区没有创建,当我得到退出代码 1 时试图删除 msck 修复 table.
我想知道以下是否可行或可行:
将 CSV 文件加载到内部配置单元 table 中并作为临时文件 table。
使用分区
插入"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 ...
是插入增量数据的可能解决方案。此语句应将数据加载到分区文件夹中的其他文件中,现有数据将保持原样。
我正在努力寻找在 Hive 和 HDFS 中实现以下管道的最佳方法:
我想摄取一个 csv(到目前为止没有问题)但是,我想从通知到 csv 文件的字段中创建分区。
我创建了一个外部 table 将文件存放在 HDFS 上并定义了分区字段,但是通过简单的放置(这是有道理的)分区没有创建,当我得到退出代码 1 时试图删除 msck 修复 table.
我想知道以下是否可行或可行:
将 CSV 文件加载到内部配置单元 table 中并作为临时文件 table。
使用分区
插入"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 ...
是插入增量数据的可能解决方案。此语句应将数据加载到分区文件夹中的其他文件中,现有数据将保持原样。