Hive 表 DML 操作 第1关:将文件中的数据导入(Load)到 Hive 表中

相关知识

之前系列实训中我们接触过导入本地文件到Hive表中,本关就进行导入的详细讲解。

为了完成本关任务,你需要掌握:1.导入命令语法,2.如何将本地txt文件导入到分区表中。

导入命令语法

Load操作执行copy/move命令把数据文件copy/move到Hive表位于 HDFS上的目录位置,并不会对数据内容执行格式检查或格式转换操作。Load命令语法为:

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=vall,partcol2=val2 …)];

文件路径filepath可以是指向HDFS的相对路径或是绝对路径,也可以是指向本地文件系统(Linux文件系统)相对路径(当前工作目录)或绝对路径。

若filepath指向HDFS,LOAD执行的是move操作(即执行LOAD后filepath中的文件不再存在);若filepath指向本地文件系统,LOAD执行的是copy操作(即执行LOAD后filepath中的文件仍然存在),但需要指定LOCAL关键字。

若filepath指向一个文件,LOAD会copy或move相应的文件到表tablename;若filepath指向一个目录,LOAD会copy或move相应目录下的所有文件到表tablename。若创建表时指定了分区列,使用 LOAD 命令加载数据时也要为所有分区列指定特定值。

针对LOAD语句中指明LOCAL关键字,INPATH参数可以使用下述方式确定:

  • Hive 会在本地文件系统中查找filepath

  • 用户可以设置filepath为文件绝对路径,如file:///user/hive/data

    针对LOAD语句中未指明LOCAL关键字,INPATH参数可以使用下述方式确定:

    • 若filepath为相对路径,Hive会解析成为/user//filepath

    • filepath未指定模式或文件系统类型(如hdfs://namenode:9000/),Hive会把${fs.default.name}值作为Namenode URL

      若语句带OVERWRITE关键字,目标表或分区中的原始数据会被删除,替换成新数据;若未指定OVERWRITE关键字,新数据会以追加的方式被添加到表中。

      若表或分区中的任何一个文件与filepath中的任何一个文件同名,则表或分区中的同名文件会被filepath中的同名文件替换。

      将本地txt文件导入到分区表中(例子)

      • 创建数据库shopping:
        CREATE DATABASE IF NOT EXISTS shopping
        LOCATION '/hive/shopping';
        
        • 假设在数据库shopping中有分区表items_info2:
          CREATE TABLE IF NOT EXISTS shopping.items_info2(
          name STRING COMMENT 'item name',
          price FLOAT COMMENT 'item price',
          category STRING COMMENT 'item category',
          brand STRING COMMENT 'item brand',
          type STRING COMMENT 'item type',
          stock INT COMMENT 'item stock',
          address STRUCT  COMMENT 'item sales address')
          COMMENT 'goods information table'
          PARTITIONED BY (p_category STRING,p_brand STRING) //设置分区
          ROW FORMAT DELIMITED
          FIELDS TERMINATED BY ','
          COLLECTION ITEMS TERMINATED BY '-'
          TBLPROPERTIES ('creator'='Xiaoming','date'='2019-01-01');
          • 如假设本地文件/home/shoppings.txt内容为:

            • 字段间分隔符,根据表中设置FIELDS TERMINATED BY ','确定的。如果表中设置FIELDS TERMINATED BY '\t',那么字段间就应该用Tab键间隔开

            • 集合分隔符-根据表中设置COLLECTION ITEMS TERMINATED BY '-'确定的。如果表中设置COLLECTION ITEMS TERMINATED BY ',',那么字段间就应该用逗号,键间隔开

              • 使用LOAD命令加载本地文件数据到items_info2表相应的分区中(PARTITION关键字指定内容):
                load data local inpath '/home/shoppings.txt' overwrite into table items_info2
                partition (p_category='shoes',p_brand='playboy');

                • 执行LOAD命令后,Hive会在 HDFS 的/hive/shopping/items2/路径下创建目录p_category=shoes/p_brand=playboy/,并且会把items_info.txt文件复制到上述创建的目录下

                  编程要求

                  student表结构:

                  INFOTYPE
                  SnoINT
                  nameSTRING
                  ageINT
                  sexSTRING
                  scoreSTRUCT

                  本地文件/home/student.txt的内容为:

                  • 创建数据库test1;

                    mysql> create database test1;
                    Query OK, 1 row affected (0.00 sec)
                    • 切换到test1数据库;

                      mysql> use test1;
                      Database changed
                      • 在test1中创建相应格式的表student(未分区),表结构如上所示,分隔符根据/home/student.txt的内容设置;

                      • 将/home/student.txt的数据导入到表student中。

                        /********* Begin *********/
                        create database if not exists test1 location '/hive/test1';
                        use test1;
                        create table if not exists test1.student (
                            Sno int,
                            name string,
                            age int,
                            sex string,
                            score struct )
                        row format delimited 
                        fields terminated by ',' 
                        collection items terminated by '-';
                        load data local inpath '/home/student.txt' overwrite into table student;
                        /********* End *********/
                        select * from student;
                        
                        1. 按照以上要求填写命令。每个要求对应一条命令,共4条命令,以;隔开。(请勿删除代码框架)
                        2. 由于hive启动时间较长,测评时请耐心等待,大概需要时间:60s左右。