我目前正在开发一个Java MapReduce作业,它应该将数据输出到一个分块的Hive表。
我想到两种方法:
首先通过HCatalog直接写入Hive。问题是,这种方法不支持写入一个分区的Hive表。因此,当使用一个分段的Hive表时,我需要首先写入一个非bucketed表,然后将其复制到一个bucketed表。
第二个选项是将输出写入文本文件,然后将此数据加载到Hive中。
这里的最佳做法是什么?
对于大量数据(关于内存和时间),哪种方法更具性能?
如果我还可以使用非分区的Hive表,哪种方法会更好?
非常感谢!
答案 0 :(得分:1)
对于非分段表,您可以将MapReduce输出存储在表存储位置。然后,您只需运行MSCK REPAIR TABLE
即可使用新分区更新元数据。
Hive的加载命令实际上只是将数据复制到表存储位置。
此外,来自HIVE documentation:
CLUSTERED BY和SORTED BY创建命令不会影响数据如何插入表中 - 只会影响它的读取方式。这意味着用户必须小心地通过指定减少器的数量等于桶的数量,并在其查询中使用CLUSTER BY和SORT BY命令来正确插入数据。
因此,您需要调整MapReduce输出以适应这些约束。