我有像这样来自 MySQL 的数据..
ItemID
Metric1
Metric2
Metric3
和数据,所以我使用 Hive 来实现 Hadoop..
ItemID
Metric1
Metric2
Metric3
现在 ItemID 是唯一标识符。因此,我要使用以下列设置输出到一个文件中的内容是:
ItemID
Metric1 (MySQL)
Metric2 (MySQL)
Metric3 (MySQL)
Metric1 (Hadoop)
Metric2 (Hadoop)
Metric3 (Hadoop)
有没有另一种方法,然后循环遍历一个文件,然后在另一个文件中搜索 ItemID 并将匹配的行输出到另一个文件中?这看起来效率很低。
最佳答案
今天是您的幸运日,因为 Hadoop 是为分组而构建的。不幸的是,我不认为有一种自然的方法可以让 Hive 在 SQL 中执行此操作,因为它必须处理非规范化数据。唯一烦人的部分是你的数据格式,但我稍后会谈到。
我的建议是编写一个 MapReduce 作业来加载两个数据集,按唯一项目 ID 值分组,然后在 reducer 中整理它们。
一些伪代码:
mapper for MySQL:
output ItemID as the key, Metric# + "(MySQL)" as the value
mapper for Hadoop:
output ItemID as the key, Metric# + "(Hadoop)" as the value
reducer:
output the ItemID, then each item in the iterator
一些注意事项:
我建议使用
MultipleInputs
这样您就可以区分数据是来自 Hadoop 还是来自 MySQL。您将为每个设置一个 map 类,然后将该 map 类分配给输入数据。看起来您的输入格式有点令人痛苦,因为“记录分隔符”有点模棱两可。你如何知道你到达了一个 ItemID 的末尾并进入了下一个 ItemID?它们与指标有显着不同吗?您可能需要某种自定义输入格式或记录阅读器来完成此操作。如果您能以某种方式更改输入数据,使其在
ItemID\tMetric1;Metric2;Metric3
中读取,您的生活就会轻松很多。
你可以考虑 Pig。它以您对它的“包”更好一点的形式处理非规范化数据。你可以使用 COGROUP
运算符在两个单独的 LOAD
语句之后将数据组合在一起,然后将其吐出。您的输入数据格式也会让 pig 讨厌。
关于mysql - 比较来自两个不同数据源(MySQL 和 Hadoop)的数据的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18665170/