Hive 到 Hive ETL

Posted

技术标签:

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

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

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

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

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

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

现在,我需要:

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

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

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

【问题讨论】:

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

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

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

    添加 JAR /home/ubuntu/lookup.jar

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

    添加文件 /home/ubuntu/lookupA;

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

    CREATE TEMPORARY FUNCTION getLookupValueA AS 'com.LookupA';

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

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

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

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

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

【讨论】:

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

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

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

【讨论】:

以上是关于Hive 到 Hive ETL的主要内容,如果未能解决你的问题,请参考以下文章

mysql导入到hive hdfs上显示又数据了 hive表里面啥都没有

hive常用功能:Hive数据导入导出方式

如何从Oracle到hive

hive 分析结果导出到一个文本中

Hive- Hive安装

使用Spark实现推主机群Hive数据到租户集群Hive的高性能Hive2Hive数据集成Java需编写JDBC连接Hive解析元数据