我知道Hadoop中没有文件更新,但是在Hive中,可以使用语法糖将新值与表中的旧数据合并,然后使用合并输出重写表,但如果我有新的然后我可以通过使用左外连接来实现相同的效果。
我的问题是我必须通过将一个值设置为具有where
条件的列来更新表。众所周知,SET
不受支持。
例如,请考虑以下常规查询:
UPDATE temp1
SET location=florida
WHERE id=206;
我试图在Hive中转换它,但我被卡在SET
的位置。如果有人让我知道,那对我来说将是一个很大的帮助。
答案 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:您能否发布您使用的查询?