比较来自两个不同数据源(MySQL和Hadoop)的数据的有效方法

时间:2013-09-06 19:26:45

标签: mysql hadoop hive

我有来自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并将匹配的行输出到另一个文件中?这似乎效率很低。

1 个答案:

答案 0 :(得分:0)

这是您的幸运日,因为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。您将为每个设置一个地图类,然后将该地图类分配给输入数据。

  • 看起来您的输入格式有点痛苦,因为“记录分隔符”有点含糊不清。你怎么知道你到达ItemID的末尾并进入下一个ItemID?它们与度量标准有很大不同吗?您可能需要某种自定义输入格式或记录阅读器才能完成此操作。如果你能以某种方式更改你的输入数据,那么它会在ItemID\tMetric1;Metric2;Metric3中读到你的生活将会轻松得多。


你可以考虑猪。它处理非正规化数据的形式,你用它的“袋子”更好一点。您可以在两个单独的LOAD语句之后使用COGROUP运算符将数据分组在一起,然后将其吐出。您的输入数据格式对于猪来说也很烦人。