6

最近我想将日志文件加载到 hive 表中,我想要一个可以从某个目录读取数据并将它们自动加载到 hive 中的工具。这个目录可能包含很多子目录,例如某个目录是'/log',子目录是'/log/20130115','/log/20130116','/log/201301017'。是否有一些ETL工具可以实现这样的功能:一旦新数据存储在某个目录中,该工具可以自动检测该数据并将其加载到hive表中。有没有这样的工具,我必须自己写脚本吗?

4

2 回答 2

6

您可以使用 Hive 外部表轻松完成此操作并按天对表进行分区。例如,这样创建您的表:

create external table mytable(...) 
partitioned by (day string) 
location '/user/hive/warehouse/mytable';

这实际上将在元存储中创建一个空表并使其指向/user/hive/warehouse/mytable.

然后您可以使用key=value格式将数据加载到此目录中,其中key是您的分区名称(此处为“day”),value 是您的分区的值。例如:

hadoop fs -put /log/20130115 /user/hive/warehouse/mytable/day=20130115

一旦你的数据被加载到那里,它就在 HDFS 目录中,但是 Hive 元存储还不知道它属于表,所以你可以这样添加它:

alter table mytable add partition(day='20130115');

您应该一切顺利,元存储将使用您的新分区进行更新,您现在可以在该分区上查询您的表。

这对脚本来说应该是微不足道的,您可以创建一个每天运行一次的 cron 作业,它将按顺序执行这些命令并找到要使用该date命令加载的分区,例如连续执行此命令:

hadoop fs -test /log/`date +%Y%m%d`

并检查是否$?等于 0 将告诉您文件是否在这里,如果是,您可以传输它并如上所述添加分区。

于 2013-01-17T07:06:57.677 回答
1

您可以使用 Hive 提供的 LOAD DATA 命令。它完全符合您的用例。在本地文件系统中指定一个目录并从中创建 Hive 表。

示例用法 - LOAD DATA LOCAL INPATH '/home/user/some-directory' OVERWRITE INTO TABLE 表

于 2013-03-30T08:17:51.537 回答