Hive中的DML语句的详细梳理

本文详细梳理了Hive中的DML语句,包括如何插入数据到数据表、保存到本地磁盘,使用select查询,以及Export和Import操作。对于数据库管理和数据处理的初学者,是理解Hive数据操作的重要参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DML:Data Manipulation Language 数据操纵语言

1、插入数据到数据表

1、建表后插入数据
a)语法:
    LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename 
        [PARTITION (partcol1=val1, partcol2=val2 ...)]

b)注意:
    不加local剪切hdfs上的数据到hive数据目录,加local复制linux本地的数据到hive数据目录


c)示例:
    creat table emp (id int,name string) row format delimited 
    fields terminated by '\t' lines terminated by '\n';
    load  data [local]  inpath '/user/hive/warehouse/test1.db/test' into table emp;
    导入hdfs数据是剪切,导入本地Linux数据是复制。

d)非DML方式:
    第1种方式:
        creat table emp (id int,name string)row format delimited 
            fields terminated by '\t' lines terminated by '\n'; 
            location hdfs_path;
        hdfs dfs -put /tmp/emp /user/hive/warehouse/test1.db/test;

    第2种方式:
        creat table emp (id int,name string) row format delimited
            fields terminated by '\t' lines terminated by '\n';
        hdfs dfs -put /tmp/emp /user/hive/warehouse/test1.db/test;
        msck repair table emp;强制刷新元信息


2、建表时插入数据(单级插入)
a)语法:
    INSERT (OVERWRITE|INTO) TABLE tablename1 
        [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]]
         select_statement1 FROM from_statement;
   #####overwrite是覆盖,into是追加。into的时候不要带if not exits。没有表怎么追加啊

b)示例:
    insert overwrite table emp2  select id ,name from emp;
    注意:
        表emp2结构和select子句查出来的列数量和类型及顺序都要一致,否则报错或出现业务上的问题。


3、建表时插入数据(多级插入)

语法:
    FROM from_statement

    INSERT (OVERWRITE|INTO) TABLE tablename1 [PARTITION (partcol1=val1 ...) 
        [IF NOT EXISTS]] select_statement1

    [INSERT (OVERWRITE|INTO) TABLE tablename1 [PARTITION (partcol1=val1 ...) 
        [IF NOT EXISTS]] select_statement2....];
    
示例:
    from emp1
        insert overwrite table emp2  select name, id
        insert into table emp3 select name, age;


注意:
    当要从一个表中查询多个数据插入新表时,如果单级插入,每次执行SQL语句都要执行一个MR程序。 
    每个MR程序中的shuffle和资源调度都十分消耗性能和浪费时间。
    而使用多级插入,只会有一个MR程序,可以提升效率,节省时间。
    必须会。








3、插入数据到本地磁盘

1、单级插入

语法:
    INSERT OVERWRITE [LOCAL] DIRECTORY directory1
        [ROW FORMAT row_format] [STORED AS file_format] 
        SELECT ... FROM ...

注意:
    overwrite:覆盖。所以写路径的时候一定不要写根目录,否则后果很严重。
    local:写local数据导入本地目录,不写则导入hdfs目录。
    #####:目录可以不存在,hive会自动创建,当然,hive要有权限才行。

    


2、多级插入

语法:
    FROM from_statement
        INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
        [INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2] ...

    from:from子句的数据来源刻是一个子查询,但子查询的表必须有一个别名
            from (select *from emp) tmp

4、select相关

1、union all:
    select * from emp where id=1 union all select * from emp2;
    分组聚合会产生数据倾斜,而 union all 常用于处理数据倾斜问题

2、case....when....then...end:
    select ename, salary,
        case
            when salary > 1 and salary <= 1000then'LOWER'
            when salary > 1000 and salary <= 2000then'MIDDLE'
            when salary > 2000 and salary <= 4000then'HIGH'
            else'HIGHEST'
        end
    from emp;

3、between...and:
    select * from emp where sal between 1000 and 2000;    #####左闭右闭

4、group by:
    select id ,name,avg(sal) from emp group by id ,name having sal>1000;
    #####出现在select后的字段要么出现在group by后面,要么是在聚合函数内
    #####group by中做过滤只能用having

5、Export 和Import

1、应用场景
    EXPORT命令将表或分区的数据以及元数据导出到指定的输出位置。
    然后可以将此输出位置移动到不同的Hadoop或Hive实例。

2、导出数据
语法:
    EXPORT TABLE tablename [PARTITION (part_column="value"[, ...])]
        TO 'export_target_path' [ FOR replication('eventid') ]

示例:
    export table department to 'hdfs_exports_location/department';

​3、导入数据
语法:
    IMPORT [[EXTERNAL] TABLE new_or_original_tablename 
        [PARTITION (part_column="value"[, ...])]]
        FROM 'source_path'
        [LOCATION 'import_target_path']

示例:
    import from 'hdfs_exports_location/department';   

import/export更多用法参考官网。

DML官网参考。

 

 

 

### Hive 数据操作语言 (DML) 语法规则及使用示例 #### 删除数据 对于支持 ACID 的表,可以执行 `DELETE` 操作来移除符合条件的记录。此功能自 Hive 0.14 版本起可用,在执行过程中会自动禁用矢量化处理以确保兼容性[^2]。 ```sql DELETE FROM tablename WHERE expression; ``` 为了优化性能,建议在删除前设定参数 `hive.optimity.sort.dynamic.partition=false` 来创建更为有效的执行方案。 #### 加载数据 通过 `LOAD DATA` 命令可将外部文件导入至指定表格中。该命令仅涉及物理位置上的变动而不改变实际内容,因此速度较快且资源消耗较少[^3]。 ```sql LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename; ``` 选项 `[LOCAL]` 表明源路径位于本地文件系统而非 HDFS;而关键字 `[OVERWRITE]` 则指示覆盖目标表中原有数据的行为。 #### 导出数据 利用 `EXPORT` 和 `IMPORT` 功能可以在不同环境间迁移整个表结构及其关联的数据集合。这不仅简化了跨集群传输流程,还保留了原有的分区信息和其他元数据特性[^4]。 ```sql -- 导出表 EXPORT TABLE default.student TO '/user/hive/warehouse/export/student'; -- 导入表 IMPORT TABLE new_table_name FROM '/path/to/import/source'; ``` #### 插入多张表 当需要基于同一查询结果填充多个目的表时,可通过单一扫描动作完成多项插入任务,从而减少重复读取带来的开销并提升整体作业效率[^5]。 ```sql INSERT ALL INTO target_table_1 SELECT * FROM source_table INTO target_table_2 SELECT specific_columns FROM source_table SELECT ... ; ``` 上述方法允许在一个事务周期内向若干个目的地同步推送相同或经过筛选变换后的字段集,适用于ETL场景下的批量加工需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二百四十九先森

你的打赏是我努力的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值