1

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

4

1 回答 1

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你的生活中阅读会容易得多。


您可以为此考虑 Pig。它以您对它的“包”更好的形式处理非规范化数据。您可以COGROUP在两个单独LOAD的语句之后使用运算符将​​数据组合在一起,然后将其吐出。您的输入数据格式也会让猪感到烦恼。

于 2013-09-06T20:07:55.390 回答