impala的update用法
更新声明(仅限Impala 2.8或更高版本)
更新Kudu表中的任意行数。此语句仅适用于使用Kudu存储引擎的Impala表。
句法:
<span style="color:#000000"><code>
UPDATE [database_name.]table_name SET col = val [, col = val ... ]
[ FROM joined_table_refs ]
[ WHERE where_conditions ]
</code></span>
使用说明:
构成主键的列都不能由SET
子句更新 。
该WHERE
条款中的条件与该语句允许的条件相同SELECT
。请参阅SELECT语句 以获取详细信
如果WHERE
省略该子句,则更新表中的所有行。
WHERE
子句中 的条件可以指主键列或其他列的任意组合。引用WHERE
子句中的主键列比引用非主键列更有效。
因为Kudu目前在并发DML操作期间不强制执行强一致性,所以请注意,此语句完成后的结果可能与您直观期望的不同:
-
如果某些行由于找不到某些主键列而无法更新,由于它们被并发
DELETE
操作删除,该语句会成功但会返回警告。 -
的
UPDATE
声明也可能会重叠INSERT
,UPDATE
或UPSERT
在同一台同时运行的语句。声明完成后,表中可能会有比预期更多或更少的匹配行,因为未定义是否UPDATE
适用UPDATE
于正在进行中插入或更新的行。
受影响的行数在impala-shell消息和查询概要文件中报告。
可选FROM
子句允许您将更新限制为仅指定表中属于连接查询结果集的行。join子句可以包括非Kudu表,但删除行的表必须是Kudu表。
声明类型: DML
要点: 在性能关键型查询中使用的表中添加或替换数据后,请发出COMPUTE STATS
语句以确保所有统计信息都是最新的。考虑在Impala中的任何INSERT
,LOAD DATA
或CREATE TABLE AS SELECT
语句之后,或在通过Hive加载数据并在Impala中执行之后更新表的统计信息。此技术对于非常大的表,在连接查询中使用或两者都特别重要。 REFRESH table_name
例子:
以下示例显示如何对表执行简单更新,包含或不包含WHERE
子句:
<span style="color:#000000"><code>
-- Set all rows to the same value for column c3.
-- In this case, c1 and c2 are primary key columns
-- and so cannot be updated.
UPDATE kudu_table SET c3 = 'not applicable';
-- Update only the rows that match the condition.
UPDATE kudu_table SET c3 = NULL WHERE c1 > 100 AND c3 IS NULL;
-- Does not update any rows, because the WHERE condition is always false.
UPDATE kudu_table SET c3 = 'impossible' WHERE 1 = 0;
-- Change the values of multiple columns in a single UPDATE statement.
UPDATE kudu_table SET c3 = upper(c3), c4 = FALSE, c5 = 0 WHERE c6 = TRUE;
</code></span>
以下示例显示如何使用FROM
带有join子句的关键字执行更新 :
<span style="color:#000000"><code>
-- Uppercase a column value, only for rows that have
-- an ID that matches the value from another table.
UPDATE kudu_table SET c3 = upper(c3)
FROM kudu_table JOIN non_kudu_table
ON kudu_table.id = non_kudu_table.id;
-- Same effect as previous statement.
-- Assign table aliases in FROM clause, then refer to
-- short names elsewhere in the statement.
UPDATE t1 SET c3 = upper(c3)
FROM kudu_table t1 JOIN non_kudu_table t2
ON t1.id = t2.id;
-- Same effect as previous statements, but more efficient.
-- Use WHERE clause to skip updating values that are
-- already uppercase.
UPDATE t1 SET c3 = upper(c3)
FROM kudu_table t1 JOIN non_kudu_table t2
ON t1.id = t2.id
WHERE c3 != upper(c3);
</code></span>
相关信息:
使用Impala查询Kudu表,INSERT语句, DELETE语句(仅限Impala 2.8或更高版本),UPSERT语句(仅限Impala 2.8或更高版本)
父主题: Impala SQL语句