【问题标题】:how to load data in hive automatically如何在 hive 中自动加载数据
【发布时间】:2013-01-17 06:33:07
【问题描述】:

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

【问题讨论】:

    标签: hadoop load 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 表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多