星星博客 »  > 

Sqoop学习笔记(三)——导入数据

1、创建测试数据

CREATE DATABASE sqoop;
 
use sqoop;
CREATE TABLE sqoop.goodtbl(
gname varchar(50),
serialNumber int,
price int,
stock_number int,
create_time date);
 
DROP FUNCTION IF EXISTS `rand_string`;
DROP PROCEDURE IF EXISTS `batchInsertTestData`;
 

mysql> DELIMITER //
mysql> CREATE FUNCTION `rand_string` (n INT) RETURNS VARCHAR(255)
    -> CHARSET 'utf8'
    -> BEGIN
    -> DECLARE char_str varchar(200) DEFAULT
    -> '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    -> DECLARE return_str varchar(255) DEFAULT '';
    -> DECLARE i INT DEFAULT 0;
    -> WHILE i < n DO
    -> SET return_str = concat(return_str,
    -> substring(char_str, FLOOR(1 + RAND()*36), 1));
    -> SET i = i+1;
    -> END WHILE;
    -> RETURN return_str;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)

-- 第一个参数表示:序号从几开始;第二个参数表示:插入多少条记录

mysql> CREATE PROCEDURE `batchInsertTestData` (m INT, n INT)
    -> BEGIN
    -> DECLARE i INT DEFAULT 0;
    -> WHILE i < n DO
    -> insert into goodtbl (gname, serialNumber, price, stock_number, create_time)
    -> values (rand_string(6), i+m, ROUND(RAND()*100), FLOOR(RAND()*100), now());
    -> SET i = i+1;
    -> END WHILE;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> call batchInsertTestData(1, 100);
Query OK, 1 row affected (0.03 sec)

2、导入全部数据

[root@linux101 ~]# sqoop import \
> --connect jdbc:mysql://linux101:3306/sqoop \
> --username hive \
> --password w5623009 \
> --table goodtbl \
> --target-dir /root/lagou \
> --delete-target-dir \
> --num-mappers 1 \
> --fields-terminated-by "\t" 

查看目录

hdfs dfs -ls /root/lagou

查看数据

hdfs dfs -cat /root/lagou/*

  • target-dir:将数据导入 HDFS 的路径;
  • delete-target-dir:如果目标文件夹在 HDFS 上已经存在,那么再次运行就会报

错。可以使用--delete-target-dir来先删除目录。也可以使用 append 参数,表示追加数据;

  • num-mappers:启动多少个Map Task;默认启动4Map Task;也可以写成 - m 1
  • fields-terminated-byHDFS文件中数据的分隔符;

 

3、导入查询数据

[root@linux101 data]# sqoop import \
> --connect jdbc:mysql://linux101:3306/sqoop \
> --username hive \
> --password w5623009 \
> --target-dir /root/lagou \
> --append \
> -m 1 \
> --fields-terminated-by "\t" \
> --query 'select gname, serialNumber, price, stock_number, create_time from goodtbl where price>88 and $CONDITIONS;'

  • 查询语句的where子句中必须包含 '$CONDITIONS'
  • query后使用的是双引号,则$CONDITIONS前必须加转移符,防止shell识别为自己的变量

4、导入指定的列

[root@linux101 data]# sqoop import \
> --connect jdbc:mysql://linux101:3306/sqoop \
>  --username hive \
> --password w5623009 \
> --table goodtbl \
> --columns gname,serialNumber,price \
> --target-dir /root/lagou/3 \
> --append \
> -m 1 \
> --fields-terminated-by "\t"

备注: columns 中如果涉及到多列,用逗号分隔,不能添加空格
 
5、导入查询数据(使用关键字)
 
[root@linux101 data]# sqoop import \
> --connect jdbc:mysql://linux101:3306/sqoop \
> --username hive \
> --password w5623009 \
> --table goodtbl \
> --where "price>=90" \
> --target-dir /root/lagou/4 \
> --append \
> -m 1 \
> --fields-terminated-by ","

 

6、启动多个Map Task导入数据 

goodtbl 中增加数据: call batchInsertTestData(300,1000000);
 
[root@linux101 data]# sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true \
> --connect jdbc:mysql://linux101:3306/sqoop \
> --username hive \
> --password w5623009 \
> --target-dir /root/lagou \
> --delete-target-dir \
> --fields-terminated-by "\t" \
> --table goodtbl \
> --split-by gname
 
给 goodtbl 表增加主键
alter table goodtbl add primary key(serialNumber);
使用多个 Map Task 进行数据导入时, sqoop 要对每个 Task 的数据进行分区
  • 如果 MySQL 中的表有主键,指定 Map Task 的个数就行
  • 如果 MySQL 中的表有主键,要使用 split-by 指定分区字段
  • 如果分区字段是字符类型,使用 sqoop 命令的时候要添加:

-Dorg.apache.sqoop.splitter.allow_text_splitter=tru

  • 查询语句where子句中 '$CONDITIONS' ,也是为了做数据分区使用,即使只有1Map Task

6.1 MySQL导入到Hive中

hive 中创建表
 
hive (mydb)> CREATE TABLE mydb.goodtbl(
           > gname string,
           > serialNumber int,
           > price int,
           > stock_number int,
           > create_time date);

[root@linux101 ~]# sqoop import \
> --connect jdbc:mysql://linux101:3306/sqoop \
> --username hive \
> --password w5623009 \
> --table goodtbl \
> --hive-import \
> --hive-table mydb.goodtbl \
> --hive-overwrite \
> --fields-terminated-by "\t" \
> -m 1

  • hive-import。必须参数,指定导入hive
  • hive-databaseHive库名(缺省值default)
  • hive-tableHive表名
  • fields-terminated-byHive字段分隔符
  • hive-overwrite。覆盖中已经存在的数据
  • create-hive-table。创建好 hive 表,但是表可能存在错误。不建议使用这个参数,提前建好表

相关文章