我有一个场景 - 使用实用程序数据文件[每次都有相同的名称 - 首先删除旧文件然后加载更新/最新文件]会定期从源系统推送到定义位置的HDFS。 该数据文件需要进一步推入蜂巢表。
我正在寻找实现这一目标的最佳方法:
1)在hive中创建一个外部表,指向HDFS中的位置 数据由HDFS中的实用程序推送,这将继续更新 一旦数据文件被更新,hive表数据就会自动生成 效用
2)在hive中创建一个内部/托管表,hive中有数据 仓库。现在使用配置为cron job-in的shell脚本 定期间隔检查配置单元仓库中存在的文件的时间戳 和文件存在于实用程序正在推送/更新的位置 数据,如果时间戳不相同,则脚本将删除该文件 从蜂巢仓库中将最新文件复制到其中。
3)每次使用其他名称创建新的hive表时,请加载 最新的数据文件进入它,删除旧表,最后重命名新的 表格到hive中的旧表名。
4)还有其他方法吗?
我需要专家评论哪种方法似乎最好?我也担心会出现这样一种情况:我将使用这些方法执行任何数据文件更改,并且有人同时访问该表...有没有办法避免这种情况?
注意:通过Sqoop作为增量加载,不会将数据加载到HDFS / Hive中。此外,每次更新的文件将再次具有全旧/更新的数据以及新数据。因此,此文件的大小可能会随着时间的推移而增加,因为它同时包含旧数据,更新数据和新数据。
此致 布佩希
答案 0 :(得分:0)
如果您使用的是高于0.14的Hive版本,则可以进行上述操作。您应该使用hive的upsert功能。
您可以创建外部表和托管表。它们应该具有相同的表结构 - 外部表将包含来自实用程序文件(原始表单)的所有数据,以及可以更新的upsert功能,根据需要(SCD II)插入内部表。我在下面创建的示例 A为外部, B为内部。您可以在此链接中找到https://hortonworks.com/blog/update-hive-tables-easy-way/
merge into A
using B on A.id = B.id
when matched then update set
email=B.email,
when not matched then insert
values(B.id, B.email);
最后,您可以设置一个oozie工作流程,它将定期执行插入/更新/删除或设置任何cron作业。此外,您还需要从外部表中定期删除数据以维护hdfs。
或强>
您可以使用kudu而不是hive。请参阅我的answer此处