【问题标题】:Hive to Hive ETLHive 到 Hive ETL
【发布时间】:2016-05-22 02:57:17
【问题描述】:

我有两个大型 Hive 表,比如 TableA 和 TableB(它们从不同的来源加载)。

这两个表具有几乎相同的表结构/列具有相同的分区列,日期存储为字符串。

我需要根据某些(相同的)过滤条件从每个表中过滤记录。

这些表有一些包含“代码”的列,需要查找这些列以获取其对应的“值”。

有八到十个这样的查找表,比如 LookupA、LookupB、LookupC 等,

现在,我需要:

  1. 合并来自 TableA 和 TableB 的过滤记录。
  2. 对查找表进行查找,并将过滤记录中的那些“代码”替换为它们各自的“值”。如果过滤记录或查找表中分别没有“代码”或“值”,我需要用零或空字符串替换它
  3. 将过滤记录中的日期从一种格式转换为另一种格式

我是 Hive 的初学者。请告诉我该怎么做。谢谢。

注意:我可以管理直到表格的联合。需要一些有关查找和转换的指导。

【问题讨论】:

  • @shankarsh15 分享了 hive-UDF 的查找方法。这涉及到开发人员对磁盘 I/O 的贡献。如何使用相关子查询并让 Hive 处理相同的问题?欢迎任何cmets。谢谢。

标签: sql hive etl hiveql hadoop2


【解决方案1】:

要基本上进行查找,请按照以下步骤操作,

  1. 您必须创建一个 custom User Defined function(UDF),它基本上完成了查找工作,这意味着您必须在内部创建一个 Java 程序以进行查找、jar 并将其添加到 Hive 中,如下所示:

    添加 JAR /home/ubuntu/lookup.jar

  2. 然后您必须添加包含键值对的查找文件,如下所示:

    添加文件 /home/ubuntu/lookupA;

  3. 然后您必须创建一个临时查找函数,例如

    CREATE TEMPORARY FUNCTION getLookupValueA AS 'com.LookupA';

  4. 最后,你必须在 Select 查询中调用这个查找函数,它基本上会为给定的查找键填充查找值。

    使用 JOIN 可以实现同样的效果,但这会影响性能。

采用连接方法,您可以通过查找代码很好地连接源和查找表,例如

select a.key,b.lookupvalue
table a join lookuptable b
where a.key=b.lookupKey

现在对于Date Transformation,您可以在 Hive 中使用Date functions

【讨论】:

  • 当然,这个答案开辟了新的思路。我也很想知道“加入”方法。我很感激这个答案。感谢您的宝贵时间!
  • 这个答案肯定值得投赞成票。我只是在等待来自社区的任何其他/不同的观点。将在一两天内对方法进行最后的决定,不会失败。谢谢!
【解决方案2】:

对于上述问题,请按照以下步骤操作:

  1. 使用联合模式来联合两个表(模式必须相同)。
  2. 对于上述情况,您可以尝试 pig 脚本。 脚本看起来像(jn 表 A 和表 B 与查找表并生成适当的列):
    • a = 通过代码A 左外连接表A,通过代码A 查找A。
    • b = 按代码 B 左外连接 a,按代码 B 查找 B。

对于表 B 也是如此。

假设codeA的某个值在查找表中没有值,那么:

z = foreach b generate codesA as codesA, valueA is null ? '0' as valuesA.

(将 value 中的所有 null 值替换为 0)。

  1. 如果您使用的是 Pig 0.12 或更高版本,您可以使用ToString(CurrentTime(),'yyyy-MM-dd')

希望它能解决您的问题。如有任何疑问,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2019-06-09
    • 2014-02-12
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多