最近我想将日志文件加载到hive表中,我想要一个可以从某个目录读取数据并自动将它们加载到hive的工具。该目录可能包含许多子目录,例如,某个目录是'/ log',子目录是'/ log / 20130115','/ log / 20130116','/ log / 201301017'。是否有一些ETL工具可以实现以下功能:一旦新数据存储在某个目录中,该工具就可以自动检测这些数据并将其加载到hive表中。是否有这样的工具,我是否必须自己编写脚本?
答案 0 :(得分:4)
您可以使用Hive外部表格和白天对表格进行分区来轻松完成此操作。例如,按原样创建表:
create external table mytable(...)
partitioned by (day string)
location '/user/hive/warehouse/mytable';
这实际上会在Metastore中创建一个空表,并使其指向/user/hive/warehouse/mytable
。
然后,您可以使用 key = value 格式在此目录中加载数据,其中键是您的分区名称(此处为“day”),value是值你的分区。例如:
hadoop fs -put /log/20130115 /user/hive/warehouse/mytable/day=20130115
一旦你的数据被加载,它就在HDFS目录中,但Hive Metastore还不知道它属于该表,所以你可以这样添加:
alter table mytable add partition(day='20130115');
你应该好好去,你的新分区会更新Metastore,你现在可以在这个分区上查询你的表。
这对于脚本来说应该是微不足道的,您可以创建一个每天运行一次的cron作业,按顺序执行这些命令,并找到要使用date
命令加载的分区,例如继续执行此命令: / p>
hadoop fs -test /log/`date +%Y%m%d`
并检查$?
是否等于0将告诉您文件是否在这里,如果是,您可以传输它并按上述方法添加分区。
答案 1 :(得分:1)
您可以使用Hive提供的LOAD DATA命令。它完全符合您的使用案例。在本地文件系统中指定一个目录并从中创建Hive表。
使用示例 - LOAD DATA LOCAL INPATH' / home / user / some-directory' OVERWRITE INTO TABLE表