如何在 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 -testdate 命令非常轻松地做到这一点。【参考方案2】:

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

示例用法 - 加载数据本地输入路径'/home/user/some-directory' OVERWRITE INTO TABLE 表

【讨论】:

以上是关于如何在 hive 中自动加载数据的主要内容,如果未能解决你的问题,请参考以下文章

Hive(五)DML数据操作

NSUserDefaults 自动加载和保存数据

如何在快速向上和向下滚动表格时停止自动重新加载表格视图? [关闭]

如何自动重新加载集合视图?

如何使用 spark 在 Hive 中正确加载数据?

页面加载时自动加载搜索结果