hive数据加载方式

    技术2022-07-11  89

     

    1 hive数据加载方式:

    a) 使用load加载

    b) 用查询语句向表中插入数据

    a) 使用LOAD DATA方式加载数据详解:

    命令格式如下

    Java代码 收藏代码

    LOAD DATA 【LOCAL】 INPATH ‘....’ 【OVERWRITE】 INTO TABLE t1 【PARTITION (...)】

    eg: load data local inpath '/usr/local/data/user' into table jiuye partition(grade='1');

    以上内容中,方括号中的表示可选部分。分别解释以下:

    LOCAL 表示从本地加载数据,即Linux文件系统,这时数据会复制到HDFS的Hive仓库中;如果不使用LOCAL,指的是数据从HDFS的某个路径移动到Hive仓库中。

    OVERWRITE指的是否覆盖原始数据。如果不使用OVERWRITE,但是已经导入过这批数据,那么新的导入依然能够成功,即产生两份,而不是覆盖掉原来的那一份

    PARTITION指的是导入到指定分区表中。

    b) 使用查询语句向表中插入数据详解:

     

    INSERT OVERWRITE TABLE t1 SELECT * FROM t2; // 也可以不覆盖,直接导入,把关键词OVERWRITE替换为INTO即可

    数据加载到一个分区中写法:

    INSERT OVERWRITE TABLE t2 PARTITION (day=2) SELECT * FROM t1;//将t1表的数据加载到分区为day=2的表t2中

    数据同时加载到多个分区中/或者同时加载到多个表中(数据源只有一个)

    可以这么写:

    INSERT OVERWRITE TABLE t2 PARTITION (day=2) SELECT * FROM t1;

    INSERT OVERWRITE TABLE t2 PARTITION (day=3) SELECT * FROM t1;

    .....

    这么写的坏处是SELECT * FROM t1每一次都会进行一次遍历,这样耗时,

    将t1中day=2的id写入到表t2的分区day=2文件夹下的文件中

    将t1中day=3的id写入到表t2的分区day=3文件夹下的文件中

    将t1中day=4的id写入到表t4中

    改进写法:(只扫描一次原始表,高效)

    FROM t1

    INSERT OVERWRITE TABLE t2 PARTITION(day=2) SELECT id WHERE day=2

    INSERT OVERWRITE TABLE t2 PARTITION(day=3) SELECT id WHERE day=3

    INSERT OVERWRITE TABLE t4 SELECT id WHERE day=4

    c) 动态分区插入:

     

    插入数据时,分区数据是动态的,不是如上面静态写死的,

    默认,Hive是支持动态分区插入的。如果不支持的话,可以设置  hive.exec.dynamic.partition=true;打开

    动态分区插入语法如下

    set hive.exec.dynamic.partition=true;

    set hive.exec.dynamic.partition.mode=nonstrict;

    set hive.exec.max.dynamic.partitions.pernode=1000;

    INSERT OVERWRITE TABLE t2 PARTITION (province, city) SELECT ....... , a.province, a.city FROM a;

    注意:

    动态分区字段一定要放在所有静态字段的后面,这里业务字段在前,最后

    a.province, a.city作为动态分区字段会被赋到 PARTITION (province, city)中

    INSERT OVERWRITE TABLE t2 PARTITION (province, city) SELECT 业务字段 , a.province, a.city FROM a;

    d) 动静态分区插入结合使用:

    Java代码 收藏代码

    INSERT OVERWRITE TABLE t2 PARTITION (province=’beijing’, city) SELECT ....... , a.city FROM a;

    此时,SELECT ....... , 都是作为业务字段被赋值到t2表中的,而 a.city则是作为动态分区字段查询到后赋值到 t2的分区字段中的。

    2 hive数据导出方式:

    一是直接使用HDFS命令导出文件夹。

    二是使用如下语法

    insert overwrite local directory ‘/tmp/t1’ SELECT id FROM t1; // directory表示存放目录

    // 将t1的id数据导出到本地磁盘文件 /tmp/t1中

    Processed: 0.010, SQL: 9