hive表数据更新insert overwrite/merge into

这篇具有很好参考价值的文章主要介绍了hive表数据更新insert overwrite/merge into。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景:

根据甲方要求,需要对大数据平台指定表(hive、impala表)的历史数据[2021-01-01至2023-03-29]指定字段进行批量更新,然后把表同步到Oracle。先更新大数据平台上的表,再把更新完成的表同步到Oracle。hive有8张表更新,其中4张大表【分区表】(数据量分别为:1038738976、260958144、25860509、2867005),另外4张小表(几万、二十几万的样子)。

一、小表更新,不用按月\按分区更新,直接全量更新。

insert overwrite table 表a (字段1,字段2,...,字段n)
select 
字段1,字段2,...,
nvl(t2.projectbelong,t1.projectbelong) projectbelong,
...,
字段n
from 表a t1
left join 表b t2 on t1.root_item_code=t2.desc1;

二、大表更新,拿其中一张表举例:按月\按分区更新

方法一:

insert overwrite table 表1 partition (date_month = '2021-01',date_day,org_code) 
select 
字段1,字段2,...,
nvl(t2.projectbelong,t1.projectbelong) projectbelong,
...,
字段n,
--t1.date_month,
t1.date_day,
t1.org_code
from (select * from 表1 where date_month = '2021-01')  t1
left join 表2 t2 on t1.root_item_code=t2.desc1;

替换date_month日期即可。

方法二:

使用impala外部命令:impala-shell

1、创建impala.sql脚本,内容如下:

Linux上,使用vim:

vim impala.sql

 写入以下内容:

insert overwrite table 表1 partition (date_month = '${var:CURR_TIME}',date_day,org_code) 
select 
字段1,字段2,...,
nvl(t2.projectbelong,t1.projectbelong) projectbelong,
...,
字段n,
--t1.date_month,
t1.date_day,
t1.org_code
from (select * from 表1 where date_month = '${var:CURR_TIME}')  t1
left join 表2 t2 on t1.root_item_code=t2.desc1;

2、impala外部命令:

impala-shell -f impala.sql -d tianma_bi --var CURR_TIME='2021-01';

3、多个月份,使用vim命令创建bash文件:impala.sh

impala-shell -f impala.sql -d tianma_bi --var CURR_TIME='2021-01';
impala-shell -f impala.sql -d tianma_bi --var CURR_TIME='2021-02';
impala-shell -f impala.sql -d tianma_bi --var CURR_TIME='2021-03';

4、执行sh文件:

sh impala.sh

更新总结:m-分钟、s-秒
1、百万级表数据总量:500万,更新用时约20s
2、千万级表数据总量:2500万,更新用时约1m
3、亿级表数据总量:分区更新
50万,更新用时约17s
100万,更新用时约32s
500万,更新用时约2m10s
1000万,更新用时约5m
1500万,更新用时约6m
2000万,更新用时约6m30s
5000万,更新用时约16m
7500万,更新用时约22m
根据以上,估算1亿数据更新用时约35m

方法三:也可使用merge into

说明:Hive在2.2版本之后开始支持Merge操作,并且Merge只能在支持ACID的表上执行。低版本的hive中有很多函数或者语句不支持使用,比如merge into

举个例子:

MERGE INTO merge_data.transactions AS T 
USING merge_data.merge_source AS S
ON T.ID = S.ID and T.tran_date = S.tran_date
WHEN MATCHED AND (T.TranValue != S.TranValue AND S.TranValue IS NOT NULL) THEN UPDATE SET
     TranValue = S.TranValue
    ,last_update_user = 'merge_update'
WHEN MATCHED AND S.TranValue IS NULL THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (
    S.ID
    , S.TranValue
    , 'merge_insert'
    , S.tran_date
);

建议使用merge into,效率更快一些。 文章来源地址https://www.toymoban.com/news/detail-473102.html

到了这里,关于hive表数据更新insert overwrite/merge into的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第3.1章:StarRocks数据导入--Insert into

    Insert Into是我们在MySQL中常用的导入方式,StarRocks同样也支持使用Insert into的方式进行数据导入,并且每次insert into操作都是一次完整的导入事务。 在StarRocks中,Insert的语法和MySQL等数据库的语法类似,具体可以参考官网文档: Insert Into 导入 @ InsertInto @ StarRocks Docs https://docs.s

    2024年02月08日
    浏览(40)
  • SQL 数据操作技巧:SELECT INTO、INSERT INTO SELECT 和 CASE 语句详解

    SELECT INTO 语句将数据从一个表复制到一个新表中。 新表将按照在旧表中定义的列名和类型创建。您可以使用 AS 子句创建新的列名。 以下 SQL 语句创建 Customers 的备份副本: 以下 SQL 语句使用 IN 子句将表复制到另一个数据库中的新表中: 以下 SQL 语句仅复制一些列到新表中:

    2024年02月05日
    浏览(106)
  • 第3.1章:StarRocks数据导入——Insert into 同步模式

       在StarRocks中,insert的语法和mysql等数据库的语法类似,并且每次insert into操作都是一次完整的导入事务。  主要的 insertInto 命令包含以下两种: insert into tbl select ... insert into tbl (col1, col2, ...) values (1, 2, ...), (1,3, ...);   其中第二种命令仅用于demo,不要使用在测试或生产环境

    2024年02月21日
    浏览(41)
  • Apache Doris (二十三) :Doris 数据导入(一)Insert Into

    目录 1. 语法及参数 2. 案例 ​​​​3. 注意事项 3.1. 关于插入数据量

    2024年02月13日
    浏览(40)
  • spark-sql: insert overwrite分区表问题

    用spark-sql,insert overwrite分区表时发现两个比较麻烦的问题: 从目标表select出来再insert overwrite目标表时报错:Error in query: Cannot overwrite a path that is also being read from. 从其他表select出来再insert overwrite目标表时,其他分区都被删除了. 印象中这两个问题也出现过,但凭经验和感觉,

    2024年02月11日
    浏览(31)
  • openGauss学习笔记-11 openGauss 简单数据管理-INSERT INTO语句

    在创建一个表后,表中并没有数据,使用这个表之前,需要向表中插入数据。INSERT INTO语句用于向表中插入新记录。该语句可以插入一行数据也可以同时插入多行数据。 11.1 语法格式 11.2 参数说明 table_name 要插入数据的目标表名。 取值范围:已存在的表名。 column_name 目标表中

    2024年02月17日
    浏览(41)
  • GaussDB数据库中的MERGE INTO介绍

    一、前言 二、GaussDB MERGE INTO 语句的原理概述 1、MERGE INTO 语句原理 2、MERGE INTO 的语法 3、语法解释 三、GaussDB MERGE INTO 语句的应用场景 四、GaussDB MERGE INTO 语句的示例 1、示例场景举例 2、示例实现过程 1)创建两个实验表,并初始化测试数据 2)更新 target_table 中的销售数据,

    2024年01月21日
    浏览(27)
  • insert into select 语法使用

    INSERT INTO SELECT语句:从一个表复制数据,然后把数据插入到一个已存在的表中。 将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中, 这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了。 1.INSERT INTO SELECT语句 语句形式为:Insert into Table2(fie

    2024年02月16日
    浏览(47)
  • MySQL 中 INSERT INTO 的使用详解

    MySQL 是一个非常流行的关系型数据库管理系统,具有高效和可扩展性等特点。在 MySQL 数据库中,INSERT INTO 是一种用于将新行插入表中的 SQL 命令。它是 MySQL 最基本、最常用的语句之一,也是许多应用程序的核心功能之一。本文将介绍如何正确地使用 INSERT INTO,以及如何处理异

    2024年02月15日
    浏览(49)
  • Apache Doris 数据导入:Insert Into语句;Binlog Load;Broker Load;HDFS Load;Spark Load;例行导入(Routine Load)

    Doris 提供多种数据导入方案,可以针对不同的数据源进行选择不同的数据导入方式。Doris支持各种各样的数据导入方式:Insert Into、json格式数据导入、Binlog Load、Broker Load、Routine Load、Spark Load、Stream Load、S3 Load,下面分别进行介绍。 注意: Doris 中的所有导入操作都有原子性保

    2024年02月21日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包