最近我想将日志文件加载到hive表中,我想要一个可以从某个目录读取数据并自动将它们加载到hive的工具.该目录可能包含许多子目录,例如,某个目录是'/ log',子目录是'/ log/20130115','/ log/20130116','/ log/201301017'.是否有一些ETL工具可以实现以下功能:一旦新数据存储在某个目录中,该工具就可以自动检测这些数据并将它们加载到hive表中.是否有这样的工具,我是否必须自己编写脚本?
您可以使用Hive外部表并按天对表进行分区,轻松完成此操作。例如,按如下方式创建您的表:
create external table mytable(...)
partitioned by (day string)
location '/user/hive/warehouse/mytable';
Run Code Online (Sandbox Code Playgroud)
这实际上将在元存储区中创建一个空表并将其指向/user/hive/warehouse/mytable
。
然后,您可以使用key = value格式将数据加载到该目录中,其中key是您的分区名称(此处为“ day”),而value是您的分区的值。例如:
hadoop fs -put /log/20130115 /user/hive/warehouse/mytable/day=20130115
Run Code Online (Sandbox Code Playgroud)
数据加载到那里之后,它就位于HDFS目录中,但是Hive Metastore尚不知道它属于该表,因此可以通过以下方式添加它:
alter table mytable add partition(day='20130115');
Run Code Online (Sandbox Code Playgroud)
而且您应该很好,Metastore将使用您的新分区进行更新,现在您可以在该分区上查询表。
这对于脚本来说应该是微不足道的,您可以创建每天运行一次的cron作业,该作业将按顺序执行以下命令,并找到要使用该date
命令加载的分区,例如连续执行以下命令:
hadoop fs -test /log/`date +%Y%m%d`
Run Code Online (Sandbox Code Playgroud)
然后检查是否$?
等于0会告诉您该文件是否在此处,如果存在,则可以如上所述传输文件并添加分区。
归档时间: |
|
查看次数: |
7079 次 |
最近记录: |