更新,Hive中的SET选项

时间:2011-06-01 12:07:44

标签: hive

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

我的问题是我必须通过将一个值设置为具有where条件的列来更新表。众所周知,SET不受支持。

例如,请考虑以下常规查询:

UPDATE temp1
SET location=florida
WHERE id=206;

我试图在Hive中转换它,但我被卡在SET的位置。如果有人让我知道,那对我来说将是一个很大的帮助。

2 个答案:

答案 0 :(得分:10)

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_, ...)。我没有使用多个分区,一次只有一个,所以我会在一次执行所有分区之前检查测试/ dev env上的结果。我还有其他理由将每个OVERWRITE限制为一个分区。

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

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

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

希望这会有所帮助。 :)

答案 1 :(得分:1)

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

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

正如您所料,这会将您的数据分解为分区,但如果要设置的值的分布与“良好的数据块大小”成比例(这取决于您设计),那么您对该数据的查询将更好地优化

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