sqoop导入hdfs和hive(追加/增量/覆盖)

提前准备mysql数据

DROP TABLE IF EXISTS `sqooptest`;
CREATE TABLE `sqooptest` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `sqooptest` VALUES ('1', 'zhangsan', '18');
INSERT INTO `sqooptest` VALUES ('2', 'lisi', '19');
INSERT INTO `sqooptest` VALUES ('3', 'wangwu', '20');
INSERT INTO `sqooptest` VALUES ('4', 'zhaoliu', '21');
INSERT INTO `sqooptest` VALUES ('5', 'tianqi', '22');
INSERT INTO `sqooptest` VALUES ('6', 'luba', '23');
INSERT INTO `sqooptest` VALUES ('7', 'sunjiu', '24');
INSERT INTO `sqooptest` VALUES ('8', 'gaoshi', '25');
INSERT INTO `sqooptest` VALUES ('9', 'xiaoshiyi', '26');
INSERT INTO `sqooptest` VALUES ('10', 'wushier', '27');

在这里插入图片描述

1 导入hdfs不指定存储位置与分隔符

bin/sqoop import \
--connect jdbc:mysql://node03:3306/test \
--username root \
--password 123456 \
--table sqooptest \
--m 1

这种不指定文件存储位置的导入会导入到/user/root/表名下,默认是以逗号作为分隔,但是如果文件夹存在就会报错,可以添加–delete-target-dir 这样上传的时候如果文件存在就会先删除
在这里插入图片描述

2 指定存储位置与分隔符

bin/sqoop import \
--connect jdbc:mysql://node03:3306/test \
--username root \
--password 123456 \
--table sqooptest \
--m 1 \
--delete-target-dir \
--target-dir /user/mytable \
--fields-terminated-by '.'

在这里插入图片描述
指定了–delete-target-dir,所以导入之前如果有数据会删除,也就相当于覆盖

3 增量导入hdfs

hdfs上面导入如果存在文件就报错,指定了–delete-target-dir会先删除再导入,所以无法做到增量导入,增量导入如下:

bin/sqoop import \
--connect jdbc:mysql://node03:3306/test \
--username root \
--password 123456 \
--m 1 \
--table sqooptest \
--target-dir /user/increase \
--incremental append \
--check-column id \
--last-value 5

上方执行两次,第二次就是增量导入
在这里插入图片描述
如上图所示,会提示check-column 中的id此次导入后的最后一个值是10
在这里插入图片描述
注意此种方式不能与–delete-target-dir一起使用会报错,再说做增量还要有就删除,也不合理,只是不能与这个参数使用,但是第一次执行没有/user/increase也没关系会自动创建.
上方的导入是追加,可以根据指定的字段进行合并,也就是执行upsert有就更新,没有就插入

bin/sqoop import \
--connect jdbc:mysql://node03:3306/test \
--username root \
--password 123456 \
--m 1 \
--table sqooptest \
--target-dir /user/increase2 \
--incremental lastmodified \
--check-column create_date \
--last-value '2020-05-05' \
--merge-key id

因为此种导入的check-column需要一个date或者datetime类型,所以我临时添加了一列create_date
在这里插入图片描述
上方的’merge-key id’的意思是根据id去更新数据,所以执行了第一次sqoop
在这里插入图片描述
数据已经进入后我更改id=10的数据为id=11
在这里插入图片描述
再执行第二次
在这里插入图片描述
此种hdfs增量导入关键参数

--incremental append 
--check-column id 
--last-value 5

如果--incremental append那就根据id > 5取出数据再追加写入.

--incremental lastmodified 
--check-column create_date 
--last-value '2020-05-05' 
--merge-key id

如果是--incremental lastmodified那就根据create_date>=2020-05-05取出数据(注意--incremental append不包含last-value,但是--incremental lastmodified
包含last-value)再根据merge-key重复就覆盖,唯一就追加写入,此种模式下的check-column必须是date或者datetime类型
还有一种是

--incremental lastmodified 
--check-column create_date 
--last-value '2020-05-05' 
--append

我测试发现与–incremental append 没有区别,都是追加写入

4 导入到hive表追加写入

创建hive表

create table sqooptest.sqooptest(id int,name string,age int)
row format delimited fields terminated by '\001';
bin/sqoop import \
--connect jdbc:mysql://node03:3306/test \
--username root \
--password 123456 \
--table sqooptest \
--m 1 \
--fields-terminated-by '\001' \
--hive-import \
--hive-table sqooptest.sqooptest \
--target-dir /user/root/test \
--delete-target-dir 

在这里插入图片描述
以上方式为追加写入,如果执行两次,hive中查询数据就是两份
需要注意,如果不指定target-dir 默认还是会先导入到/user/root/目录下,
但是导入hive表的操作结束后会删除临时文件,但是我碰到过会出现不删除的情况,所以为了以防万一,还是需要指定–delete-target-dir

bin/sqoop import \
--connect jdbc:mysql://node03:3306/test \
--username root \
--password 123456 \
--table sqooptest \
--m 1 \
--fields-terminated-by '\001' \
--hive-import \
--hive-database sqooptest \
--target-dir /user/root/test \
--delete-target-dir 

上方我没有指定--hive-table 而是指定了--hive-database此时如果hive中没有sqooptest表,就会自动创建,但是如果有就会追加写入.注意如果已经存在sqooptest表并且分隔符为’,’,导入不会报错,但是查询出来全部为null

5 指定条件导入hive表

bin/sqoop import \
--connect jdbc:mysql://node03:3306/test \
--username root \
--password 123456 \
--table sqooptest \
--m 1 \
--fields-terminated-by '\001' \
--hive-import \
--hive-database sqooptest \
--target-dir /user/root/test \
--delete-target-dir \
--where "id>5"

添加了--where "id>5"条件
在这里插入图片描述
指定查询sql

bin/sqoop import \
--connect jdbc:mysql://node03:3306/test \
--username root \
--password 123456 \
--m 1 \
--fields-terminated-by '\001' \
--hive-import \
--hive-table sqooptest \
--hive-database sqooptest \
--target-dir /user/root/test \
--delete-target-dir \
--query 'select * from sqooptest union all select * from sqooptest where $CONDITIONS'

上方不再指定mysql table ,添加了sql查询--qurey其中sql中有一个where $CONDITIONS 这是因为通过这种方式,必须要包含where $CONDITIONS 如果有过滤条件可以where id=1 and $CONDITIONS不这样写,导入的时候回报错

6 hive的追加写入/增量写入/覆盖

hive的追加写入就是5的方式,多次导入就是追加
增量写入(upsert)是通过3的方式--incremental lastmodified只是指定的target-dir为hive表所对应的目录
hive的覆盖:
先删除hive的sqooptest表再创建,执行

bin/sqoop import \
--connect jdbc:mysql://node03:3306/test \
--username root \
--password 123456 \
--table sqooptest \
--m 1 \
--fields-terminated-by '\001' \
--hive-import \
--hive-table sqooptest.sqooptest \
--target-dir /user/root/test \
--delete-target-dir \
--hive-overwrite

只是基于4的命令添加了一个 --hive-overwrite
执行结束
在这里插入图片描述
执行第二次结果与上图一样,证明是覆盖导入.

其他常用参数

–null-string ‘xxx’ 指定mysql中字符串类型为null替换成xxx值
–null-non-string ‘xxx’ 指定mysql中非字符串类型为null替换成xxx值

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,要将HDFS上的数据导入Hive中,可以使用Sqoop工具。Sqoop是一个用于在Hadoop和关系型数据库之间进行数据传输的工具。 以下是使用Sqoop导入HDFS数据Hive的一般步骤: 1. 确保您已经安装并配置好了SqoopHive。 2. 在终端中使用以下命令执行Sqoop导入操作: ``` sqoop import \ --connect jdbc:mysql://mysql_host:port/database \ --username username \ --password password \ --table table_name \ --hive-import \ --hive-table hive_table_name \ --hive-overwrite ``` 其中,`mysql_host`是MySQL数据库的主机名,`port`是MySQL的端口号,`database`是要导入数据库名称,`username`和`password`是连接MySQL所需的用户名和密码,`table_name`是要导入的MySQL表名,`hive_table_name`是要在Hive中创建的表名。 3. 根据需要,您可以为Sqoop导入操作提供其他参数,如`--target-dir`来指定HDFS中的目标目录,以及其他Sqoop支持的参数。可以使用`sqoop import --help`命令查看完整的参数列表。 4. 执行命令后,Sqoop将会从MySQL数据库中抽取数据,并将其存储在HDFS上的目标目录中。然后,它将自动在Hive中创建一个与MySQL表结构相匹配的表,并将数据加载到该表中。 请注意,上述命令中的参数和示例是基于MySQL数据库的。如果您使用其他类型的关系型数据库,请根据需要修改连接字符串和其他参数。 希望这些信息对您有所帮助!如果您还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值