如何在 hive 中自动加载数据
Posted
技术标签:
【中文标题】如何在 hive 中自动加载数据【英文标题】:how to load data in hive automatically 【发布时间】:2013-01-17 06:33:07 【问题描述】:最近我想将日志文件加载到hive表中,我想要一个可以从某个目录读取数据并自动将它们加载到hive中的工具。这个目录可能包含很多子目录,例如某个目录是'/log',子目录是'/log/20130115','/log/20130116','/log/201301017'。是否有一些ETL工具可以实现这样的功能:一旦新数据存储在某个目录中,该工具可以自动检测该数据并将其加载到hive表中。有没有这样的工具,是不是得自己写脚本?
【问题讨论】:
【参考方案1】:您可以轻松地使用 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 会告诉您文件是否在此处,如果存在,您可以传输它并按照上述说明添加分区。
【讨论】:
非常感谢,事实上,我还有一个问题,通过这种方式,我可以将按日期划分的日志文件加载到 hive 表中,但是,我的老板让我找到一种方法或工具加载数据,意思是:假设有某个目录叫做'/log',hive会一直查询这个目录,一旦产生新数据,可能是/log/20130118,/log/20130119,hive会添加这个分区自动加载日志文件,如/20130118或/20130119到表的分区,我怎么能做到这一点,请见谅 当您指定关键字EXTERNAL
时,您的数据不会复制到任何地方,而是保留在您放置它的位置。 (当您未指定 EXTERNAL
时,Hive 会将数据复制到其自己的默认位置)。据我所知,每次您将文件添加到LOCATION
指定的文件夹并随后查询您的表时,新数据应该是可见的。自从我玩 Hive 已经有一段时间了,所以也许 @Charles Menguy 可以证实这一点?
我不是 100% 确定我理解你想要达到的目标,你能用更多细节编辑你的问题吗?如果您只想将文件加载到没有日期分区的表中,那么@Pieterjan 是对的,您可以将文件放在 HDFS 中表的根目录中,而无需更改表,Hive 将直接选择起来。
我的目标是自动加载数据,流程可能是这样的 首先,hive会检测是否存在新的日志文件,如果存在,hive会新建一个hdfs目录,例如'/练习3/20131118'并加载新的日志文件。然后它为新的日志文件创建一个新分区。因为我将分析来自电信设备的数据。所以数据很大。我必须自动加载它。我想来自 facebook 的工程师将选择自动加载大量网络数据,而不是手动加载。请原谅。非常感谢@Charles Menguy
@jackyzhang 我在回答中添加了更多细节,您可以使用hadoop fs -test
和date
命令非常轻松地做到这一点。【参考方案2】:
您可以使用 Hive 提供的 LOAD DATA 命令。它完全符合您的用例。在本地文件系统中指定一个目录并从中创建 Hive 表。
示例用法 - 加载数据本地输入路径'/home/user/some-directory' OVERWRITE INTO TABLE 表
【讨论】:
以上是关于如何在 hive 中自动加载数据的主要内容,如果未能解决你的问题,请参考以下文章