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

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

最佳答案

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

  • 看起来您的输入格式有点令人痛苦,因为“记录分隔符”有点模棱两可。你如何知道你到达了一个 ItemID 的末尾并进入了下一个 ItemID?它们与指标有显着不同吗?您可能需要某种自定义输入格式或记录阅读器来完成此操作。如果您能以某种方式更改输入数据,使其在 ItemID\tMetric1;Metric2;Metric3 中读取,您的生活就会轻松很多。


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

关于mysql - 比较来自两个不同数据源(MySQL 和 Hadoop)的数据的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18665170/

相关文章:

hadoop - 从给定查询的配置单元日志中获取应用程序 ID

python - Spark SQL 到 Hive 表 - 日期时间字段时间错误

mysql - mysql的时间戳类型

hadoop - Hive:GROUP By 上的子查询

Python Hadoop 流错误 "ERROR streaming.StreamJob: Job not Successful!"和堆栈跟踪 : ExitCodeException exitCode=134

hadoop - 从reducer输出命名零件文件

java - 对于受影响的行,Mysql 总是返回 1

php - CodeIgniter 和表格中的图像显示

php - 如何正确使用mysql中的项目ID作为特定项目的链接?

csv - 使用 Trino(以前称为 PrestoDB)将非 varchar 数据导出到 CSV 表