16

我知道 Hadoop 中没有文件更新,但在 Hive 中,可以使用语法糖将新值与表中的旧数据合并,然后用合并的输出重写表,但如果我在另一个中有新值表然后我可以通过使用左外连接来达到相同的效果。

在我的情况下,问题是我必须通过将一个值设置为具有某种where条件的列来更新表。已知SET不支持。

例如,考虑以下普通查询:

UPDATE temp1
SET location=florida
WHERE id=206;

我试图在 Hive 中进行相同的转换,但我被困在SET. 如果有人让我知道,那对我来说将是一个很大的帮助。

4

2 回答 2

11
INSERT OVERWRITE TABLE _tableName_ PARTITION (_partitionColumn_= _partitionValue_) 
SELECT [other Things], CASE WHEN id=206 THEN 'florida' ELSE location END AS location, [other Other Things] 
FROM _tableName_ WHERE [_whereClause_];

您可以列出多个分区,方法是用逗号分隔它们。... PARTITION (_partitionColumn_= _partitionValue1_, _partitionColumn_= _partitionValue2_, ...). 我没有对多个分区执行此操作,一次只执行一个,因此在一次执行所有分区之前,我会在测试/开发环境中检查结果。我还有其他理由将每个分区限制OVERWRITE为单个分区。

这个页面https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML有更多内容。
一般来说,这个站点https://cwiki.apache.org/confluence/display/Hive/LanguageManual是您使用 HiveSQL 时最好的朋友。

我开发了与此相同的东西来迁移一些数据并且它有效。我还没有针对大型数据集尝试过它,只有几 GB,而且效果很好。

注意 - 这将覆盖分区。它将使以前的文件再见。创建备份和恢复脚本/程序。[other Things]和是表[other Other Things]中的其余列。它们需要按正确的顺序排列。这非常重要,否则您的数据将被损坏。

希望这可以帮助。:)

于 2011-06-01T15:34:51.073 回答
1

这可能很老套,但它适用于我在工作中必须做的事情。

    INSERT OVERWRITE TABLE tabletop PARTITION(partname = 'valueIwantToSet')
    SELECT things FROM databases.tables WHERE whereclause;

正如您可能期望的那样,这会将您的数据分成多个分区,但是如果您要设置的值的分布与“良好的数据块大小”成正比(这取决于您的设计),那么您对该数据的查询会更好优化

@Jothi:您能否发布您使用的查询?

于 2013-02-25T20:01:15.003 回答