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

5n0oy7gb  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(341)

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

nwlls2ji

nwlls2ji1#

今天是你的幸运日,因为hadoop是为分组而构建的。不幸的是,我不认为有一种自然的方法可以让hive在sql中实现这一点,因为它必须处理非规范化的数据。唯一恼人的部分是你的数据格式,但我稍后再谈。
我的建议是编写一个mapreduce作业,加载两个数据集,按唯一的item 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类,然后将该Map类分配给输入数据。
因为“记录分隔符”有点模棱两可,所以您的输入格式看起来有点麻烦。如何判断到达一个itemid的末尾并进入下一个itemid?它们与度量标准有显著差异吗?您可能需要某种自定义输入格式或记录读取器来完成此操作。如果你能改变你的输入数据,让它读入 ItemID\tMetric1;Metric2;Metric3 你的生活会轻松很多。
你可以考虑用Pig来做这个。它处理非规范化数据的形式,你有一个更好的与它的“袋”。你可以用这个 COGROUP 两人分开后接线员 LOAD 语句将数据分组,然后将其吐出。你的输入数据格式对pig来说也很烦人。

相关问题