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表里面啥都没有
使用Spark实现推主机群Hive数据到租户集群Hive的高性能Hive2Hive数据集成Java需编写JDBC连接Hive解析元数据