zoukankan      html  css  js  c++  java
  • Hive-insert into table 与 insert overwrite table 区别

    区分insert into 和 insert overowrite: 

    0、

    命令格式

    INSERT OVERWRITE|INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] [(col1,col2 ...)]
    select_statement
    FROM from_statement;

    参数说明

    • tablename:需要插入数据的目标表名称。
    • PARTITION (partcol1=val1, partcol2=val2 ...):需要插入数据的分区名称,此参数不允许使用函数等表达式,只能是常量。
    • select_statement:SELECT子句,从源表中查询需要插入的数据。
    • from_statement:FROM子句,代表数据来源。例如,源表名称。

    功能说明

    INSERT OVERWRITE/INTO用于将计算的结果保存目标表中。
    • insert into:直接向表或表的分区中追加数据。
    • insert overwrite:先清空表中的原有数据,再向表或分区中插入数据。

    示例

    • 计算sale_detail表中不同地区的销售额存入表sale_detail_insert中。
       
      --创建目标表sale_detail_insert。
      create table sale_detail_insert like sale_detail;
      
      --给目标表增加分区。
      alter table sale_detail_insert add partition(sale_date='2013', region='china');
      
      --从源表sale_detail中取出数据插入目标表sale_detail_insert。
      insert overwrite table sale_detail_insert partition (sale_date='2013', region='china')
        select shop_name, customer_id,total_price from sale_detail;
    • 源表与目标表的对应关系依赖于在select子句中列的顺序,而不是表与表之间列名的对应关系。例如如下语句。
       
      insert overwrite table sale_detail_insert partition (sale_date='2013', region='china')
          select customer_id, shop_name, total_price from sale_detail;                      

      在创建sale_detail_insert表时,列的顺序为shop_name string、customer_id string、total_price bigint,而从sale_detailsale_detail_insert插入数据的顺序为customer_id、shop_name、total_price。此时,会将sale_detail.customer_id的数据插入sale_detail_insert.shop_name,将sale_detail.shop_name的数据插入sale_detail_insert.customer_id

    • 向某个分区插入数据时,分区列不允许出现在select列表中。下面语句报错返回,sale_date,region为分区列,不允许出现在静态分区的insert语句中。
       
      insert overwrite table sale_detail_insert partition (sale_date='2013', region='china')
         select shop_name, customer_id, total_price, sale_date, region  from sale_detail;
    • partition的值只能是常量,不可以出现表达式。以下为错误用法。
       
      insert overwrite table sale_detail_insert partition (sale_date=datepart('2016-09-18 01:10:00', 'yyyy') , region='china')
         select shop_name, customer_id, total_price from sale_detail;

    使用动态分区注意事项

    如果您需要更新表数据到动态分区,请注意以下事项:
    • insert into partition时,如果分区不存在,会自动创建分区。
    • 多个insert into partition作业并发时,如果分区不存在,会自动创建分区,但只会成功创建一个分区。
    • 如果不能控制insert into partition作业并发,则只能通过预创建分区避免问题。


    1、insert into 语句

    Hive> insert into table account select id,age,name from account_tmp;

    2、insert overwrite语句

    hive> insert overwrite table account2 select id,age,name from account_tmp;
    --------------------

    overwrite本质是覆盖现有数据!!!!(清空原有数据,新增查询数据),而into是直接将数据写入库。

     

    参考:

    https://blog.csdn.net/paopaopotter/java/article/details/83616295

    https://blog.csdn.net/qq_41582642/article/details/82897424

  • 相关阅读:
    docker
    iOS开发之抓取花瓣网json数据
    iOS与Android工程项目的简单对比
    Android与iOS的比较
    Jenkins时间和centos时间相差八小时解决方法
    MYSQL中索引里面的基数是什么意思
    使用Java写一个minio的客户端上传下载文件
    Java 使用AOP实现打印日志
    macOS使用brew安装mysql8.x
    MacOS安装homebrew报错:curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
  • 原文地址:https://www.cnblogs.com/Formulate0303/p/12842167.html
Copyright © 2011-2022 走看看