我有来自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并将匹配的行输出到另一个文件中?这似乎效率很低。
答案 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
运算符将数据分组在一起,然后将其吐出。您的输入数据格式对于猪来说也很烦人。