【问题标题】:Write to Hive in Java MapReduce Job在 Java MapReduce 作业中写入 Hive
【发布时间】:2016-11-02 18:09:12
【问题描述】:

我目前正在处理 Java MapReduce 作业,该作业应将数据输出到分桶 Hive 表。

我想到了两种方法:

首先通过 HCatalog 直接写入 Hive。问题是,这种方法不支持写入分桶 Hive 表。因此,当使用分桶 Hive 表时,我需要先写入非分桶表,然后将其复制到分桶表。

第二个选项是将输出写入文本文件,然后将此数据加载到 Hive。

这里的最佳做法是什么?

哪种方法在处理大量数据时性能更高(就内存和所用时间而言)?

如果我也可以使用非分桶 Hive 表,哪种方法会更好?

非常感谢!

【问题讨论】:

  • 不确定我是否理解正确。如果需要创建存储桶输出,则使用 mapreduce 多种输出格式创建存储桶。或者直接将数据加载到 Hive 存储桶表中,该表将在内部创建存储桶。

标签: java hadoop mapreduce hive hcatalog


【解决方案1】:

对于非分桶表,您可以将 MapReduce 输出存储在表存储位置。然后您只需要运行MSCK REPAIR TABLE 即可使用新分区更新元数据。

Hive 的加载命令实际上只是将数据复制到表存储位置。

另外,来自HIVE documentation

CLUSTERED BY 和 SORTED BY 创建命令不影响数据插入表的方式,只影响读取方式。这意味着用户必须注意正确插入数据,方法是指定 reducer 的数量等于桶的数量,并在查询中使用 CLUSTER BY 和 SORT BY 命令。

因此,您需要调整 MapReduce 输出以适应这些约束。

【讨论】:

  • 感谢@Alex L.!据我了解,它遵循一个散列函数,该函数对要存储在其中一个存储桶中的一列中的值进行散列。那么我是否需要在映射和归约之间的洗牌阶段以某种方式对这个值进行哈希处理,并根据归约器中的桶来归约值?
  • 好像是这样。我会使用 HIVE 生成一些示例分桶表,以便更容易将其逆向工程到您的 MapReduce 作业中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2018-01-21
相关资源
最近更新 更多