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