zoukankan      html  css  js  c++  java
  • 一起学Hive——详解四种导入数据的方式

    在使用Hive的过程中,导入数据是必不可少的步骤,不同的数据导入方式效率也不一样,本文总结Hive四种不同的数据导入方式:

    • 从本地文件系统导入数据
    • 从HDFS中导入数据
    • 从其他的Hive表中导入数据
    • 创建表的同时导入数据

    使用导入数据时,会使用到into和overwrite into两个关键字,into是在当前表追加数据,而overwrite into是删除当前表的数据然后在导入数据。

    从本地系统导入数据

    在Hive中创建load_data_local表,该表中有两个字段,一个是name一个是age。创建表的SQL语句如下:

    create table if not exists load_data_local(name string,age int)  
    row format delimited fields terminated by ' '  
    lines terminated by '
    ';
    

    在本地文件系统中创建一个load_data_local.txt的文件,然后往里面写入数据,数据之间用空格分隔。数据为:

    zhangsan 30
    lisi 50
    wangwu 60
    peiqi 6
    

    执行load data local inpath '/home/hadoop/hive_test/load_data_local.txt' into table load_data_local;命令,即可将本地系统中的文件的数据导入到Hive表中。

    在使用从本地系统导入数据大Hive表中时,文件的路径必须使用绝对路径。

    有两种方式验证数据是否导入成功,一种是在Hive中执行select * from load_data_local。另外一种是查看hdfs文件系统中的load_data_local目录下面是否有刚刚上传的load_data_local.txt文件,查看命令为:hadoop fs -ls /user/hive/warehouse/bigdata17.db/load_data_local,结果为:

    18/10/07 02:37:11 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    Found 1 items
    -rwxr-xr-x   3 root supergroup         38 2018-10-07 02:24 /user/hive/warehouse/bigdata17.db/load_data_local/load_data_local.txt
    

    从HDFS中导入数据

    在Hive中创建load_data_hdfs表,表中有两个字段,分别是name和age。创建表的SQL如下:

    create table if not exists load_data_hdfs(name string,age int)  
    row format delimited fields terminated by ' '  
    lines terminated by '
    ';
    

    在本地文件系统创建文件load_data_hdfs.txt文件,然后往里面写入数据。

    将load_data_hdfs.txt文件上传到HDFS的data目录下面,命令为:hadoop fs -put load_data_hdfs.txt /data

    在Hive中执行命令:
    load data inpath 'data/load_data_hdfs.txt' into table load_data_hdfs;
    即可将数据导入到Hive的load_data_hdfs表中。
    从本地系统导入数据和从hdfs文件系统导入数据用的命令都是load data,但是从本地系统导入数据要加local关键字,如果不加则是从hdfs文件系统导入数据。

    从hdfs文件系统导入数据成功后,会把hdfs文件系统中的load_data_hdfs.txt文件删除掉。

    从其他的Hive表中导入数据

    这种方式要求目标表和源表都必须存在。
    创建一个要导入数据的目标表,SQL如下:

    create table if not exists load_data_local2(name string,age int) 
    row format delimited fields terminated by ' '  
    lines terminated by '
    ';
    

    导入数据的SQL:

    insert into table load_data_local2 select * from load_data_local;
    

    这种数据导入方式也适用于分区表和分桶表的情况。本文只介绍导入分区表的情况,导入数据到分区表分为静态分区和动态分区两种方式。

    我们先创建一个分区表,SQL如下:

    create table if not exists load_data_partition(name string)  
    partitioned by(age int)  
    row format delimited fields terminated by ' '  
    lines terminated by '
    ';
    

    将数据导入分区表必须先在Hive中执行下面两句语句:

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

    静态方式将load_data_local表的数据导入到load_data_partition表的sql语句如下:

    insert into table load_data_partition partition(age=25) select name from load_data_local;
    

    这种方式必须显示的指定分区值,如果分区有很多值,则必须执行多条SQL,效率低下。

    动态方式将load_data_local表的数据导入到load_data_partition表的sql语句如下:

    insert overwrite table load_data_partition partition select name,age from load_data_local;
    

    这种方式要注意目标表的字段必须和select查询语句字段的顺序和类型一致,特别是分区字段的类型要一致,否则会报错。

    一张表有两个以上的分区字段,如果同时使用静态分区和动态分区导入数据,静态分区字段必须写在动态分区字段之前。

    Hive还支持一条SQL语句中将数据插入多个表的功能,只需将from关键字前置即可:

    from load_data_local 
    insert overwrite table load_data_partition partition (age)
      select name,age
    insert overwrite table load_data_local3 
      select *
    

    上面的sql语句同时插入到表load_data_partition和load_data_local3表中。这种方式非常高效,对于大数据量并且要将数据插入到多个表的情况下,建议用这种方式。

    创建表的同时导入数据

    这种方式的创建表的表结构来自于select查询语句的查询字段。

    创建load_data_local3并将load_data_loaca的数据导入到load_data_local3表中:

    create table load_data_local3 as select * from load_data_local;
    
  • 相关阅读:
    nextcloud环境搭建及部署
    docker容器内访问宿主机,访问不通 错误:Host is unreachable
    记录一下SQL的行行比较
    记录一次nginx平滑升级
    letsencrypt免费SSL证书自动续期
    守护进程因echo挂掉的原因,以及重定向标准输入、标准输出和标准错误
    openresty lua-nginx-module模块中文文档
    nginx localhost的坑
    PHP7 MongoDb的操作类
    tomcat 性能检测
  • 原文地址:https://www.cnblogs.com/airnew/p/9752342.html
Copyright © 2011-2022 走看看