sqoop的使用
-----大数据ETL工具之sqoop
Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,
可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,
也可以将HDFS的数据导进到关系型数据库中。
1、显示连接的所有库名
sqoop list-databases \
--connect jdbc:mysql://192.168.226.130:3306 \
--username root \
--password Aa123456
2、显示某个数据库里所有表
sqoop list-tables \
--connect jdbc:mysql://192.168.1.122:3306/los \
--username root \
--password ''
3、从mysql导入表到hive测试
先测试,先导入到hive下面mydb这个数据库命令:
--全表/全量导入
sqoop import \
--connect jdbc:mysql://192.168.1.122:3306/los \
--username root \
--password '' \
--table t01_customer \
--hive-import \
--hive-table ods.ods_t01_customer_tmp \
--hive-overwrite \
--fields-terminated-by '\t' \
--delete-target-dir \
--m 1
---(增量导入)SQL 查询
sqoop import \
--connect jdbc:mysql://192.168.1.122:3306/los \
--username root \
--password '' \
--query 'select cust_id,age,sex from t01_customer where $CONDITIONS and age>30 ' \
--hive-import \
--hive-table ods.ods_t01_customer_tmp \
--hive-overwrite \
--fields-terminated-by ',' \
--delete-target-dir \
--target-dir '/tmp/user' \
--m 1
delete-target-dir ##每次先把产生的临时目录删掉
--m 1 小的数据量就不用再 分割了
------先清空目标表
sqoop eval \
--connect jdbc:oracle:thin:@192.168.1.122:1521:orcl \
--username ads \
--password adstest \
--query 'truncate table ads_test'
-----导入数据(从hadoop导入到关系库中)
sqoop export \
--connect jdbc:oracle:thin:@192.168.1.122:1521:orcl \
--username ads \
--password adstest \
--table ads_test \
--export-dir /user/hive/warehouse/emp \
--columns empno,ename \
--input-fields-terminated-by ',' \
--input-lines-terminated-by '\n'
---注意事项:
0. 如果建表的时候,没有指定分隔符,在hadoop版本2.7.0,hive版本2.1.0 中,建表的时候默认分隔符是 \u001--ascii表上的1
1. oracle 建表
表中的字符类型的长度 到大于hive中字符的长度。 -->nvarchar(255)
数字 长度 number(7,2) --实际的位数,会超过9位 -->number
还款表,recorddate 作为分区,正常的数据 2012-04-01
oracle 字段定义的时候: nvarchar2(20), 实际的指是:current_timestamp -> 2020-04-18 18:00:01.898 (23位)
症状:进度卡在 100% 或者75%
2. 数字类型的空值 NULL,需要nvl()处理完,再导入到 number 类型的字段中。
空值在hadoop的文件中,使用两个字符\N 来表示。\N 不能转为数字了。