Sqoop 的导入、导出 使用方法

日萌社

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)


 

Sqoop 导入:把MySQL数据库表中数据 导入到 hive数据库表中(hdfs文件系统路径下的结构化数据文件中)

1.创建数据库:userdb
2.导入 userdb.sql 到 userdb数据库中
3.把 MySQL数据库中的 某表数据 导入到 HDFS
    1.格式:(在所安装的sqoop根目录下执行命令)
            bin/sqoop import \
                    --connect jdbc:mysql://IP:3306/数据库名 \
                    --username MySQL用户名 \
                    --password MySQL密码 \
                    --target-dir /hdfs目录路径名(数据输出目录) \ # 不能预先创建“/hdfs目录路径名”的文件夹,会报错显示输出目录已经存在 
                    --table 表名 --m 1

      2.例子:把 MySQL数据库中的 emp表数据 导入到 HDFS文件系统路径下的/sqoopresult文件夹中的part-m-00000文件
        1.注意:不能预先创建“/hdfs目录路径名”的文件夹,程序会自动创建。
                如果已经存在指定的存储数据的“/hdfs目录路径名”的文件夹的话,会报错显示输出目录已经存在
        2.在所安装的sqoop根目录下执行命令: 
            bin/sqoop import \
                   --connect jdbc:mysql://192.168.25.100:3306/userdb \
                   --username root \
                   --password admin \
                   --target-dir /sqoopresult \ # 不能预先创建“/hdfs目录路径名”的文件夹,会报错显示输出目录已经存在 
                   --table emp --m 1

    3.查看hdfs文件系统下的文件内容的命令:hdfs dfs -cat /sqoopresult/part-m-00000


 

4.将MySQL数据库中的某表的结构 复制到 hive中的数据库中的某表中
    1.格式:(在所安装的sqoop根目录下执行命令)
        bin/sqoop create-hive-table \
        --connect jdbc:mysql://IP:3306/数据库名 \
        --table MySQL数据库表 \
        --username MySQL用户名 \
        --password MySQL密码 \
        --hive-table hive中的数据库名.表名 # hive中的数据库必须已经存在,而表是会自动创建,无需自己创建

    2.例子: (在所安装的sqoop根目录下执行命令)
        bin/sqoop create-hive-table \
        --connect jdbc:mysql://192.168.25.100:3306/userdb \
        --table emp_add \
        --username root \
        --password admin \
        --hive-table itheima.emp_add

      参数分析:--table emp_add 为MySQL中的数据库userdb中的表   
            --hive-table itheima.emp_add 为hive中的数据库中的表。hive中的数据库必须已经存在,而表是会自动创建,无需自己创建 


   
    3.验证:
        1.use itheima;
        2.desc emp_add;

5.把MySQL中的某数据库中的某表种数据 导入到 hive中的某数据库中的某表中
    1.格式:(在所安装的sqoop根目录下执行命令)
        bin/sqoop import \
        --connect jdbc:mysql://IP:3306/数据库名 \
        --username MySQL用户名 \
        --password MySQL密码 \
        --table MySQL数据库表名 \
        --hive-table hive中的数据库名.表名 \ # hive中的数据库和表都必须已经存在  
        --hive-import \
        --m 1

    2.例子:把MySQL中的数据库userdb中的emp_add表数据 导入到 hive中的itheima数据库中的emp_add表 
        bin/sqoop import \
        --connect jdbc:mysql://192.168.25.100:3306/userdb \
        --username root \
        --password admin \
        --table emp_add \
        --hive-table itheima.emp_add \
        --hive-import \
        --m 1


 
    3.验证 

6.把 where查询条件子语句 所查询出的结果数据 存储到 hdfs文件系统下的某目录下的文件中
    1.格式:(在所安装的sqoop根目录下执行命令)
        bin/sqoop import \
        --connect jdbc:mysql://IP:3306/数据库名 \
        --username MySQL用户名 \
        --password MySQL密码 \
        --where "字段名='字段值'" \
        --target-dir /hive中的文件夹名(数据输出目录) \ # 不能预先创建“/hdfs目录路径名”的文件夹,会报错显示输出目录已经存在 
        --table MySQL数据库表名 --m 1

    2.例子:把 where查询条件子语句 所查询出的结果数据 存储到 hdfs文件系统下的“/wherequery”的目录下的文件中
        1.hadoop fs -mkdir /sqoopresult/wherequery
        2.(在所安装的sqoop根目录下执行命令)
            bin/sqoop import \
            --connect jdbc:mysql://192.168.25.100:3306/userdb \
            --username root \
            --password admin \
            --where "city ='sec-bad'" \
            --target-dir /wherequery \  # 不能预先创建“/hdfs目录路径名”的文件夹,会报错显示输出目录已经存在 
            --table emp_add --m 1

        3.查看hdfs文件系统下的文件内容的命令:hdfs dfs -cat /wherequery/part-m-00000 

7.把 select查询语句的查询结果 存储到 hdfs文件系统下的某目录下的文件中
    1.格式:
        bin/sqoop import \
        --connect jdbc:mysql://IP:3306/数据库名 \
        --username MySQL用户名 \
        --password MySQL密码 \
        --target-dir /hive中的文件夹名(数据输出目录) \ # 不能预先创建“/hdfs目录路径名”的文件夹,会报错显示输出目录已经存在
        --query 'select id,字段名 from MySQL数据库表名 WHERE 语句 and $CONDITIONS' \ # 必须加上 and $CONDITIONS
        --split-by 字段名 \ # split-by对非数字类型的字段支持不好。一般用于主键及数字类型的字段
        --fields-terminated-by '分隔符' \ # hive的输出目录中的文件使用该分隔符进行分割数据
        --m 1

      参数解析:
        1.split-by 根据不同的参数类型有不同的切分方法,如int型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来 确定划分几个区域。
          比如select max(split_by),min(split-by) from得到的max(split-by)和min(split-by)分别为1000和1,而num-mappers(-m)为2的话,
          则会分成两个区域 (1,500)和(501-1000),同时也会分成2个sql给2个map去进行导入操作,
          分别为select XXX from table where split-by>=1 and split-by<500和select XXX from table where split-by>=501 and split-by<=1000。
          最后每个map各自获取各自SQL中的数据进行导入工作。 
        2.当split-by不是int型时出现如上场景中的问题。目前想到的解决办法是:将-m 设置称1,split-by不设置,即只有一个map运行,缺点是不能并行map录入数据。
           (注意,当-m 设置的值大于1时,split-by必须设置字段) 
        3.split-by即便是int型,若不是连续有规律递增的话,各个map分配的数据是不均衡的,可能会有些map很忙,有些map几乎没有数据处理的情况

    2.例子:把 select查询语句的查询结果 存储到 hdfs文件系统下的“/wherequery12”的目录下的文件中
        bin/sqoop import \
        --connect jdbc:mysql://192.168.25.100:3306/userdb \
        --username root \
        --password admin \
        --target-dir /wherequery12 \
        --query 'select id,name,deg from emp WHERE id > 1203 and $CONDITIONS' \
        --split-by id \
        --fields-terminated-by ',' \
        --m 1

    3.查看hdfs文件系统下的文件内容的命令:hdfs dfs -cat /wherequery12/part-m-00000 

8.增量导入:
    进行增量导入(数据追加)的条件:
        --check-column 字段名
        --last-value 字段值
        在MySQL的某数据库中某表中,把 大于某字段的字段值的 每行数据 追加导入到 hive中的数据库表(目录)中的文件中,
        即把MySQL的某数据库中某表中新添加的数据 继续追加到 (hdfs文件系统路径)hive中的数据库表中的文件中。

    1.格式:
        bin/sqoop import \
        --connect jdbc:mysql://IP:3306/数据库名 \
        --username MySQL用户名 \
        --password MySQL密码 \
        --table MySQL数据库表名 --m 1 \
        --incremental append \ # append 表示追加模式
        --check-column 字段名 \
        --last-value 字段值 \
        --target-dir /hdfs目录路径名(数据输出目录) # 可以已经存在“/hdfs目录路径名(数据输出目录)”的文件,并且会在该目录下创建新的一个文件保存追加的数据 

    2.例子:
        进行增量导入(数据追加)的条件:此处把MySQL的sqoopdb数据库中得emp表中,根据 大于1205的 id值 的每行数据 追加导入到 hive中的数据库表中的文件中,
        即把emp表中新添加的数据 继续追加添加到 (hdfs文件系统路径)hive中的数据库表中的文件中。
        bin/sqoop import \
        --connect jdbc:mysql://192.168.25.100:3306/userdb \
        --username root \
        --password admin \
        --table emp --m 1 \
        --incremental append \
        --check-column id \
        --last-value 1205
        --target-dir /sqoopresult # 可以已经存在“/sqoopresult”的文件,并且会在该目录下创建新的一个文件保存追加的数据

    3.查看hdfs文件系统下的文件内容的命令:hdfs dfs -cat /sqoopresult/part-m-00001


======================================================================

Sqoop 导出:把 hive数据库表中数据(hdfs文件系统路径下的结构化数据文件中的数据) 导出到 MySQL数据库表中 


 

Sqoop 导出:把 hive数据库表中数据(hdfs文件系统路径下的结构化数据文件中的数据) 导出到 MySQL数据库表中 
    1.准备 hive数据库表中的数据(hdfs文件系统路径下的结构化数据文件中的数据)
        1201,gopal,manager,50000,TP
        1202,manisha,preader,50000,TP
        1203,kalil,php dev,30000,AC
        1204,prasanth,php dev,30000,AC
        1205,kranthi,admin,20000,TP
        1206,satishp,grpdes,20000,GR

    2.把结构化数据文件上传到hdfs文件系统路径下:/emp_data
        hadoop fs -mkdir /emp_data
        hadoop fs -put /root/hivedata/2.txt /emp_data

    3.创建MySQL数据库表
        1.mysql -uroot -padmin
        2.use userdb;
        3.create table employee ( id INT NOT NULL PRIMARY KEY, name VARCHAR(20), deg VARCHAR(20), salary INT, dept VARCHAR(10));

    4.执行Sqoop的导出命令:
        1.格式:
            bin/sqoop export \
            --connect jdbc:mysql://IP:3306/数据库名 \
            --username MySQL用户名 \
            --password MySQL密码 \
            --table MySQL数据库表名 \
            --export-dir /hive中的文件夹名(数据导出目录) 
        2.例子:
            1.cd /root/sqoop
            2.命令:
                bin/sqoop export \
                --connect jdbc:mysql://192.168.25.100:3306/userdb \
                --username root \
                --password admin \
                --table employee \
                --export-dir /emp_data

     5.测试:select * from employee;


========================================================

sqoop 命令

1.列出MySQL中所有数据库的名字
    格式:
        bin/sqoop list-databases \
        --connect jdbc:mysql://IP:3306 \
        --username MySQL用户名 \
        --password MySQL密码
   
2.列出MySQL中某个数据库下的所有数据表的名字
    格式:
        bin/sqoop list-tables \
        --connect jdbc:mysql://IP:3306/数据库名 \
        --username MySQL用户名 \
        --password MySQL密码

	1.Apache Sqoop  
		Sqoop 是 Hadoop 和 关系数据库服务器 之间传送数据的一种工具。
		它是用来从关系数据库如:MySQL,Oracle 到 Hadoop 的 HDFS,并从 Hadoop 的文件系统 导出数据到 关系数据库。
		由 Apache 软件基金会提供。 

	2.Sqoop:“SQL 到 Hadoop 和 Hadoop 到 SQL”。
		Sqoop 工作机制是将 导入或导出命令 翻译成 mapreduce 程序来实现。 
		在翻译出的 mapreduce 中主要是对 inputformat 和 outputformat 进行定制。 	

	3.sqoop 安装  
		安装 sqoop 的前提是已经具备 java 和 hadoop 的环境。最新稳定版: 1.4.6 
		1.配置文件修改: 
			1.cd $SQOOP_HOME/conf 
			2.mv sqoop-env-template.sh sqoop-env.sh 
			3.vi sqoop-env.sh 
				export HADOOP_COMMON_HOME=/root/apps/hadoop/  
				export HADOOP_MAPRED_HOME=/root/apps/hadoop/ 
				export HIVE_HOME=/root/apps/hive 
			4.加入 mysql 的 jdbc 驱动包 
				cp /hive/lib/mysql-connector-java-5.1.28.jar $SQOOP_HOME/lib/ 
			5.验证启动 
				bin/sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password hadoop 
			6.本命令会列出所有 mysql 的数据库。到这里,整个 Sqoop 安装工作完成。

		2.Sqoop 导入 
			1.“导入工具”导入单个表从 RDBMS 到 HDFS。表中的每一行被视为 HDFS 的记录。
			  所有记录都存储为文本文件的文本数据(或者 Avro、sequence 文件等二进制数据) 。 
			2.下面的语法用于将数据导入 HDFS。 
				$ sqoop import (generic-args) (import-args) 
			3.Sqoop 测试表数据 
				在 mysql 中创建数据库 userdb,然后执行参考资料中的 sql 脚本。 
				创建三张表: emp emp_add emp_conn。 

			4.导入 mysql 表数据到 HDFS 
				1.下面的命令用于从 MySQL 数据库服务器中的 emp 表导入 HDFS。 
					bin/sqoop import \ 
					--connect jdbc:mysql://node-21:3306/sqoopdb \ 
					--username root \ 
					--password hadoop \ 
					--target-dir /sqoopresult \ 
					--table emp --m 1 
				2.其中--target-dir 可以用来指定导出数据存放至 HDFS 的目录; 
				3.mysql jdbc url 请使用 ip 地址。 
				4.为了验证在 HDFS 导入的数据,请使用以下命令查看导入的数据:hdfs dfs -cat /sqoopresult/part-m-00000 
				5.可以看出它会用逗号,分隔 emp 表的数据和字段。 
					1201,gopal,manager,50000,TP 
					1202,manisha,Proof reader,50000,TP 
					1203,khalil,php dev,30000,AC 
					1204,prasanth,php dev,30000,AC 
					1205,kranthi,admin,20000,TP 

			5.导入 mysql 表数据到 HIVE 
				1.将关系型数据的表结构复制到 hive 中 
					bin/sqoop create-hive-table \ 
					--connect jdbc:mysql://node-21:3306/sqoopdb \ 
					--table emp_add \ 
					--username root \ 
					--password hadoop \ 
					--hive-table test.emp_add_sp 
				2.其中: 
					--table emp_add 为 mysql 中的数据库 sqoopdb 中的表。    
					--hive-table emp_add_sp 为 hive 中新建的表名称。 
				3.从关系数据库导入文件到 hive 中 
					bin/sqoop import \ 
					--connect jdbc:mysql://node-21:3306/sqoopdb \ 
					--username root \ 
					--password hadoop \ 
					--table emp_add \ 
					--hive-table test.emp_add_sp \ 
					--hive-import \ 
					--m 1 
				4.导入表数据子集 
					1.--where 可以指定从关系数据库导入数据时的查询条件。 
					  它执行在各自的数据库服务器相应的 SQL 查询,并将结果存储在 HDFS 的目标目录。 
						bin/sqoop import \ 
						--connect jdbc:mysql://node-21:3306/sqoopdb \ 
						--username root \ 
						--password hadoop \ 
						--where "city ='sec-bad'" \ 
						--target-dir /wherequery \ 
						--table emp_add --m 1 
					2.复杂查询条件: 
						bin/sqoop import \ 
						--connect jdbc:mysql://node-21:3306/sqoopdb \ 
						--username root \ 
						--password hadoop \ 
						--target-dir /wherequery12 \ 
						--query 'select id,name,deg from emp WHERE  id>1203 and $CONDITIONS' \ 
						--split-by id \ 
						--fields-terminated-by '\t' \ 
						--m 1
				

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

あずにゃん

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值