加入 Hive 不好吗?

Is it bad to do joins in Hive?

您好,我最近加入了一份使用 Hive 和 PostgreSQL 的新工作。现有的 ETL 脚本从按日期分区的 Hive 收集数据并在 PostgreSQL 中为这些数据创建 tables,然后 PostgreSQL scripts/queries 执行左连接并创建最终的 table 用于报告目的。我过去听说 Hive 加入不是一个好主意。但是,我注意到 Hive 确实允许连接,所以我不确定为什么这是个坏主意。

我想使用 Talend 或 Mulesoft 之类的工具在 hive 中创建连接和聚合并创建临时 table 并将该临时 table 作为最终 table 传输到 PostgreSQL报告。

任何建议,特别是如果这不是 HIVE 的良好做法。我是蜂巢的新手。

谢谢。

加入 hive 的主要问题与数据局部性有关。

Hive 查询作为 MapReduce 作业执行,多个映射器将尽可能多地在数据所在的节点中启动。

但是,在连接表时,LHS 和 RHS 表中的两行数据通常不会在同一节点中,这可能会导致节点之间出现大量网络流量。

在 Hive 中加入本身并不坏,但如果加入的两个表很大可能会导致作业缓慢。

如果其中一个表明显小于另一个表,您可能希望将其存储在 HDFS 缓存中,使其数据在每个节点中都可用,这允许连接算法在本地检索所有数据。

因此,运行 Hive 中的大型连接没有任何问题,您只需要知道它们需要时间来完成。

在 HIVE 中进行连接非常好,我是一名 ETL 测试人员并且在 Hive 中的大表上执行左连接大部分时间查询 运行 顺利但有时工作会卡住或由于网络流量而变慢。

还取决于集群拥有的节点数。

谢谢

Hive 日趋成熟

反对使用连接的论据可能不再适用于最新版本的 hive。

我在manual section on join optimization中找到的最清楚的例子:

The MAPJOIN implementation prior to Hive 0.11 has these limitations:

The mapjoin operator can only handle one key at a time

所以我建议问问他们不情愿的依据是什么,然后再仔细检查是否仍然适用。他们的论点可能仍然有效,或者可能已经得到解决。


旁注: 我个人发现 Pig 代码比 hive 更容易重用和维护,考虑使用 Pig 而不是 hive 对您的 (hive table) 数据进行 map-reduce 操作。