Hive DML

1、插入数据

1.1. Loading files into tables
--加载本地数据到hive表
    load data local inpath '/root/data/data' into table psn;--(/root/data/data指的是本地        linux目录)
--加载hdfs数据文件到hive表
    load data inpath '/data/data' into table psn;--(/data/data指的是hdfs的目录)

注意:
1、load操作不会对数据做任何的转换修改操作
2、从本地linux load数据文件是复制文件的过程
3、从hdfs load数据文件是移动文件的过程
4、load操作也支持向分区表中load数据,只不过需要添加分区列的值

1.2. Insert

insert方式运行MR程序,通过程序将数据输出到表目录!
在某些场景,必须使用insert方式来导入数据:

  1. 向分桶表插入数据
  2. 如果指定表中的数据,不是以纯文本形式存储,需要使用insert方式导入

语法:
insert into|overwrite table 表名 select xxx | values(),(),()
insert into: 向表中追加新的数据
insert overwrite: 先清空表中所有的数据,再向表中添加新的数据

            
特殊情况: 多插入模式(从一张源表查询,向多个目标表插入)
    from 源表
    insert xxxx  目标表  select xxx
    insert xxxx  目标表  select xxx
    insert xxxx  目标表  select xxx

举例: from deptpart2
       insert into table deptpart1 partition(area='huaxi') select deptno,dname,loc
        insert into table deptpart1 partition(area='huaxinan') select deptno,dname,loc 
        
从查询语句中获取数据插入某张表
语法:
    Standard syntax:
    INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)             [IF NOT EXISTS]] select_statement1 FROM from_statement;
    INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)]                 select_statement1 FROM from_statement;

    Hive extension (multiple inserts):
    FROM from_statement
    INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)             [IF NOT EXISTS]] select_statement1
    [INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]]                             select_statement2]
    [INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2] ...;
        FROM from_statement
    INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)]                 select_statement1
    [INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2]
    [INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]]                             select_statement2] ...;

    Hive extension (dynamic partition inserts):
        INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2]                 ...) select_statement FROM from_statement;
        INSERT INTO TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...)                 select_statement FROM from_statement;

--注意:这种方式插入数据的时候需要预先创建好结果表
--从表中查询数据插入结果表

INSERT OVERWRITE TABLE psn9 SELECT id,name FROM psn

--从表中获取部分列插入到新表中

from psn
insert overwrite table psn9
select id,name 
insert into table psn10
select id
1.3. location

在建表时,指定表的location为数据存放的目录

1.4. import

不仅可以导入数据还可以顺便导入元数据(表结构)。Import只能导入export输出的内容!

IMPORT [[EXTERNAL] TABLE 表名(新表或已经存在的表) [PARTITION (part_column="value"[, ...])]]
  FROM 'source_path'
  [LOCATION 'import_target_path']
1. 如果向一个新表中导入数据,hive会根据要导入表的元数据自动创建表
2. 如果向一个已经存在的表导入数据,在导入之前会先检查表的结构和属性是否一致
只有在表的结构和属性一致时,才会执行导入
3. 不管表是否为空,要导入的分区必须是不存在的
import external table importtable1  from '/export1'

2、DML之导出

2.1. insert

将一条sql运算的结果,插入到指定的路径

语法: 
insert overwrite [local] directory '/opt/module/datas/export/student'
               row format xxxx
               select * from student;
               
2.2. export

既能导出数据,还可以导出元数据(表结构)!

export会在hdfs的导出目录中,生成数据和元数据!
导出的元数据是和RDMS无关! 
如果是分区表,可以选择将分区表的部分分区进行导出!
语法:  export table 表名 [partiton(分区信息) ] to 'hdfspath'

MosesDon
7 声望1 粉丝

引用和评论

0 条评论