我有一个场景 - 使用实用程序数据文件[每次都有相同的名称 - 首先删除旧文件然后加载更新/最新文件]定期从源系统推送到定义位置的HDFS。该数据文件需要进一步推入蜂巢表。
我正在寻找实现这一目标的最佳方法:
1)在hive中创建一个外部表,指向HDFS中的位置,其中数据由HDFS中的实用程序推送,这将在实用程序更新数据文件后立即自动更新hive表数据。
2)创建一个hive仓库中存在数据的内部/托管表。现在使用配置为cron作业的shell脚本 - 在常规间隔中检查hive仓库中存在的文件的时间戳和实用程序正在推送/更新数据的位置的文件,如果时间戳不相同则脚本将从hive中删除该文件仓库并将最新文件复制到其中。
3)每次使用其他名称创建新的hive表时,将最新的数据文件加载到其中,删除旧表,最后将新表重命名为hive中的旧表名。
4)还有其他方法吗?
我需要专家评论哪种方法似乎是最好的???我也担心我将使用这些方法中的任何一种来执行任何数据文件更改,并且有人同时访问该表...有没有办法避免这种情况?
注意:通过Sqoop作为增量加载,不会将数据加载到HDFS / Hive中。此外,每次更新的文件将再次具有全旧/更新的数据以及新数据。因此,该文件的大小可能随着时间的推移而增加,因为它同时具有旧的,更新的和新的数据。
此致,Bhupesh
如果您使用的是高于0.14的Hive版本,则可以进行上述操作。您应该使用hive的upsert功能。
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);
要么
你可以使用kudu而不是hive。请在这里参考我的answer